2013-06-10 2 views
0

응용 프로그램이 응용 프로그램이 포커스가 없을 때 Kay press를 어떻게 감지합니까? [해결] 응용 프로그램 창이 집중되지 않을 때 Insert 키 누름에 시작 타이머가 필요하고 다시 누르십시오. 누군가가 나에게 소스 또는 일부 MFC 기반 예제를 보여줄 수 있습니까? MFC에 멤버가 없지만 MFC에서 올바른 소스가 어떻게 구현되어 있는지 알 수 있습니까? 키를 눌러 타이머를 시작하는 방법은 무엇입니까?MFC 글로벌 키보드 후크

// MainHamsterDlg.cpp : implementation file 

     #include "stdafx.h" 
     #include "MainHamsterDlg.h" 

     // MainHamsterDlg dialog 
     IMPLEMENT_DYNAMIC(MainHamsterDlg, CDialogEx) 

     MainHamsterDlg::MainHamsterDlg(CWnd* pParent) 
      : CDialogEx(MainHamsterDlg::IDD, pParent) 
     { 

     } 

     void MainHamsterDlg::DoDataExchange(CDataExchange* pDX) 
     { 
      CDialogEx::DoDataExchange(pDX); 
     } 


     BEGIN_MESSAGE_MAP(MainHamsterDlg, CDialogEx) 
      ON_WM_TIMER() 
     END_MESSAGE_MAP() 


     HHOOK _hook; 
     KBDLLHOOKSTRUCT kbdStruct; 

     LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
     { 
      if (nCode >= 0) 
      { 
       // the action is valid: HC_ACTION. 
       if (wParam == WM_KEYUP) 
       { 
        kbdStruct = *((KBDLLHOOKSTRUCT*)lParam); 
        // a key (non-system) is pressed. 
        if (kbdStruct.vkCode == VK_INSERT) 
        { 
         SetTimer(NULL, 0, 0, NULL); <<<----- this don't starts timer 
        } 
       } 
      } 
      return CallNextHookEx(_hook, nCode, wParam, lParam); 
     } 

     void SetHook() 
     { 
      if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0))) 
      { 
       MessageBox(NULL, "Failed to install hook!", "Error", MB_ICONERROR); 
      } 
     } 

     void ReleaseHook() 
     { 
      UnhookWindowsHookEx(_hook); 
     } 

     BOOL MainHamsterDlg::OnInitDialog() 
     { SetHook(); 

      //SetTimer(0, 0, NULL); <<<------- this starts timer 
      CDialogEx::OnInitDialog(); 

      return TRUE; 
     } 

     void MainHamsterDlg::OnTimer(UINT nIDEvent) 
     { 
     //do something 
       CDialog::OnTimer(nIDEvent); 
     } 

답변

1

당신이 당신이 어떤 콜백 글로벌 후크를 만들 수 있습니다 SetWindowsHookEx

사용할 수 있습니다.

+0

키를 누를 때 타이머를 실행하는 방법은 무엇입니까? 코드의 일부분을 수행했지만 작동하지 않습니다./'if (kbdStruct.vkCode == VK_INSERT) { SetTimer (NULL, 0, 0, NULL)); } ' – Klasik

+0

일부 코드가 표시되어 직접 테스트 할 수 있습니까? : P –

+0

이제 코드를 살펴볼 수 있습니까? :) – Klasik