C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[63147] 가상키보드 한글 조합 문제... 후킹시..
문현민 [qodwlql] 2503 읽음    2010-12-03 18:37
안녕하세요 ? 질문이 있어서 이렇게 올립니다. 벌써 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);
}
이런식입니다....  어떻게 해야할까요??ㅜ

+ -

관련 글 리스트
63147 가상키보드 한글 조합 문제... 후킹시.. 문현민 2503 2010/12/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.