setwindowshook,启动钩子。
由参数决定监控哪种消息。
在dll中写调用函数。
详细请参看msdn。我不可能讲得比它更好。

解决方案 »

  1.   

    class CKeyHook:public CObject
    {
    private:
    HHOOK glhHook;public:
    // 钩子类的构造函数
    CKeyHook();
    // 钩子类的析构函数
    ~CKeyHook();
    // 安装钩子函数
    BOOL StartHook(HWND hWnd);
    // 卸载钩子函数
    BOOL StopHook();};
    static HWND hIniDlg = NULL;//对话框句柄CKeyHook::CKeyHook()
    {
    glhHook = NULL; 
    }CKeyHook::~CKeyHook()

    StopHook();
    }
    LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

    HWND hFocus = ::GetActiveWindow();  //取得当前活动窗口句柄if(nCode == HC_ACTION && hFocus == hIniDlg)//焦点在对话框
    {
    BOOL bKeyDowm = (lParam & 0x80000000) ? FALSE : TRUE; 
    if(bKeyDowm == TRUE)
            PostMessage(hFocus,WM_MY_HOTKEY,wParam,lParam);//自定义消息 return 1;//丢弃当前消息 }
    return 0;//向下传递当前消息 
    }BOOL CKeyHook::StartHook(HWND hWnd)
    {
    BOOL bResult=FALSE;
    hIniDlg = hWnd;
    glhHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,NULL,0);if(glhHook!=NULL)
            bResult=TRUE;
    return bResult; 
    }BOOL CKeyHook::StopHook()
    {
    BOOL bResult=FALSE;
    if(glhHook)
    {
    bResult= UnhookWindowsHookEx(glhHook);
    glhHook=NULL;
    }return bResult;
    }
    //使用时设置键盘钩子
    CKeyHook m_hook;
    m_hook.StartHook(this->GetSafeHwnd()); LRESULT CMakeDlg::OnMyHotKey(WPARAM wParam,LPARAM lParam)

    int nVirtKey = (int) wParam;    // virtual-key code 
    long lKeyData = (long)lParam;  switch(nVirtKey)
    {
    case 'Z':
    return 0;
              }
    }