|
안녕하세요 ? 질문이 있어서 이렇게 올립니다. 벌써 3주째 골머리를 앓고있네요....
지금 DLL에서 전역후킹을 사용하여 윈도우에 비트맵이미지를 뿌려 좌표값에 따라 클릭되면 그 문자가 메모장에 입력되게 하려고 합니다.
그런데 이놈이 문제가있는지 키보드를 클릭할때마다 메모장에 타이틀 부분이 회색빛으로 변했다가 다시 파란색으로 변하고 이런현상이 일어납니다. 아마 포커스가 왓다갔다해서 한글도 ㅎ ㅏ ㄴ ㄱ ㅡ ㄹ 이런식으로 입력 되는 것 같습니다.
그래서 문의드립니다. 소스를 보시고 어떤부분이 잘못됬는지 알려주세요..
int FAR PASCAL InstallHook()
{
myhHookMouse = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MyMouseHookingProc, hInstance, 0);
myhHookKeyboard = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)MyKeyboardHookingProc, hInstance, 0);
return 1;
}
LRESULT CALLBACK MyKeyboardHookingProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPPOINT lpcurPos = new POINT;
// RECT wndRect;
if(nCode == HC_ACTION)
{
if((wParam == 229 && lParam == -2147483647)||(wParam == 229 && lParam == -2147483648.0))
{
return true;
}
}
return CallNextHookEx(myhHookKeyboard, nCode, wParam, lParam);
}
LRESULT CALLBACK MyCallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPPOINT lpcurPos = new POINT;
RECT wndRect;
PCWPSTRUCT pParamStruct;
pParamStruct = (PCWPSTRUCT)lParam;
if(nCode >= 0)
{
if(pParamStruct->message == WM_ACTIVATE)
{
if(GetCursorPos(lpcurPos)) //현재 커서의 위치를 구해서
{
if(GetWindowRect(hwndMain, &wndRect)) // 현재 키보드의 영역안에 커서가 있으면
{
if(PtInRect(&wndRect, *lpcurPos))
{
Sleep(1);
SetForegroundWindow((HWND)pParamStruct->wParam);
return true;
}
}
}
}
}
return CallNextHookEx(myhHookCallWndProc, nCode, wParam, lParam);
}
LRESULT CALLBACK MyMouseHookingProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode>=0)
{
if(wParam == WM_LBUTTONDOWN)//왼쪽 클릭된 위치가 키보드의 화면이면 사용자 메세지를 키보드프로그램으로 보내고 아니면 그냥 통과
{
if(((LPMOUSEHOOKSTRUCT)lParam)->hwnd == hwndMain && ((LPMOUSEHOOKSTRUCT)lParam)->hwnd) // 키보드윈도우의 핸들과 같으면
{
if(GetForegroundWindow() != hwndPrevForeground && hwndPrevFocused)
{
SetForegroundWindow(hwndPrevForeground);
if(GetFocus() != hwndPrevFocused && hwndPrevFocused)
SetFocus(hwndPrevFocused);
}
PostMessage(hwndMain, WM_KEYBOARDCLICKED, wParam,lParam);//(WPARAM)lParam, (LPARAM)hwndPrevForeground);
return true;
}
else if(((LPMOUSEHOOKSTRUCT)lParam)->hwnd)
{
}
}
else if(wParam == WM_LBUTTONUP)
{
if(((LPMOUSEHOOKSTRUCT)lParam)->hwnd != hwndMain && ((LPMOUSEHOOKSTRUCT)lParam)->hwnd)
{
hwndTempForeground = GetForegroundWindow();
hwndTempFocused = GetFocus();
if(!hwndTempForeground || hwndTempForeground == hwndPrevForeground)
hwndTempForeground = GetForegroundWindow();
if(!hwndTempFocused || hwndTempFocused == hwndPrevFocused)
hwndTempFocused = GetFocus();
hwndPrevFocused = hwndTempFocused;
hwndPrevForeground = hwndTempForeground;
}
}
}
return CallNextHookEx(myhHookMouse, nCode, wParam, lParam);
}
이렇게 후킹을 합니다.
그리고 비트맵으로 뿌려준 이미지에서 좌표값에 따라서 변하는것은 keybd_event 함수를 씁니다
BEGIN_MESSAGE_MAP(CKeyWnd, CWnd)
//{{AFX_MSG_MAP(CKeyWnd)
ON_MESSAGE(WM_MOUSECLICKED,OnMouseClicked)
//}}AFX_MSG_MAP#define WM_KEYBOARDCLICKED WM_USER + 10
vk = LOBYTE(VkKeyScan('q'));
long CKeyWnd::OnMouseClicked(WPARAM wParam,LPARAM lParam)
{
switch(vk) {
keybd_event(vk,0,0,0);
Sleep(300);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
}
이런식입니다.... 어떻게 해야할까요??ㅜ
|