程序中安装了鼠标钩子,
我设置了热键,使用正常。但我要对热键弹起后UP作一下处理,怎么也抓不到那个消息。//dll中的钩子
LRESULT CALLBACK MouseTrap(int iCode, WPARAM wParam, LPARAM lParam)
// Call owner on interesting msg.
{
static HWND hWnd = ::FindWindow(NULL, I_Constant_Title);
if(iCode == HC_ACTION)
::PostMessage(hWnd, WM_MGSTRAP, wParam, lParam);
return  ::CallNextHookEx(sg_hHook, iCode, wParam, lParam);
}
//主程序中设置钩子
//
HOOKPROC hHookProcAdr = (HOOKPROC)::GetProcAddress(m_hInstanceDll, _T("MouseTrap"));
// Change hook proc.
if(m_hHook)
::UnhookWindowsHookEx(m_hHook);
m_hHook = ::SetWindowsHookEx(WH_MOUSE, hHookProcAdr, m_hInstanceDll, dwThreadId);//钩子的消息处理
LRESULT CxFrameWnd::OnMouseTrap(WPARAM wParam, LPARAM lParam)
// Called back on notifications from the mouse.
{
switch(wParam)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_NCLBUTTONDOWN:
case WM_NCRBUTTONDOWN:
case WM_LBUTTONUP:
case WM_MOUSEMOVE:
case WM_NCLBUTTONUP:
case WM_NCMOUSEMOVE:
SendMessage((UINT)wParam, wParam, lParam);
break;
}
return 0;
}//设置系统热键 HWND hWnd = this->m_hWnd;
RegisterHotKey(hWnd, ID_HOTKEY_0, MOD_CONTROL, '0'); //Ctrl + A
RegisterHotKey(hWnd, ID_HOTKEY_1, MOD_CONTROL, '1'); ///处理热键消息
LRESULT CCcFrameWnd::OnHotKey(WPARAM wParam, LPARAM lParam)
{
if (wParam == ID_HOTKEY_0)
{
OnMenu_Pause();
}
else if(wParam == ID_HOTKEY_1)
{
m_curPanel = (++m_curPanel)%m_panelList.size();
          ShowThePanels();
}
else //if(wParam == ID_HOTKEY_1_UP)

if(m_bIsPanelSelecting)
{
m_dcForPanelSel.DeleteDC();
}
              //以为可能会在这里出现热键释放的消息,结果没有
}

return TRUE;
}
//然后用普通消息
ON_WM_KEYUP()void CxFrameWnd:: OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
  AfxMessageBox("WM_KEYUP");
}//结果也不行。
我想问一下热键UP时的消息跑哪去了?
by the way : 主程序窗口是隐藏的,有托盘

解决方案 »

  1.   

    另外我想在桌面上绘图,不想受到其它程序的干扰,让所有的其它程序不能处理怎么办?
    我是想把鼠标事件独占,把CallNextHook屏了,也把OnLbutonDown中的往基类传的那句也屏了,还是不行
      

  2.   

    1.CallNextHook最好不要屏.
    2.ID_HOTKEY_1_UP从哪里传来的?
    3.你要取按键消息,应该HOOK WH_GETMESSAGE或WM_KEYBOARD.
      

  3.   

    后来我
    m_hHook = ::SetWindowsHookEx(WH_MOUSE|WM_KEYBOARD, hHookProcAdr, m_hInstanceDll, dwThreadId);switch(wParam)
    {
    case WM_LBUTTONDOWN:
    case WM_RBUTTONDOWN:
    case WM_NCLBUTTONDOWN:
    case WM_NCRBUTTONDOWN:
    case WM_LBUTTONUP:
    case WM_MOUSEMOVE:
    case WM_NCLBUTTONUP:
    case WM_NCMOUSEMOVE:
    case WM_KEYUP: //Add SendMessage((UINT)wParam, wParam, lParam);
    break;
    }
      

  4.   

    SetWindowsHookEx(WH_MOUSE|WM_KEYBOARD, hHookProcAdr, m_hInstanceDll, dwThreadId);
    WH_XXXX类值不能组合.
      

  5.   

    另外,KEYBOARD钩子处理函数处理方式与MOUSE钩子处理函数不一致.
      

  6.   

    不知道是不是一定要用HOOK,不过如果是我做,我可以得到键盘状态然后再做判断可以,单开一个线程就完了