在按下我指定的键后,我的这个代码总是执行2次。害得我要隐藏的窗口一隐藏后马上又显示出来了,怎么改才能实现让以下代码只执行一次,就是按下我指定的键以后。
以下是我的键盘HOOK代码:
LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
{
KBDLLHOOKSTRUCT *pStruct = (KBDLLHOOKSTRUCT*)lParam;
if( HC_ACTION==nCode )
{
if( pStruct->vkCode == 0x53 && pStruct->flags & LLKHF_ALTDOWN )
{
if( ::IsWindowVisible( myHwnd ) )
::ShowWindow( myHwnd, SW_HIDE );
else
::ShowWindow( myHwnd, SW_SHOW );
}
} return CallNextHookEx( hHook, nCode, wParam, lParam );
}

解决方案 »

  1.   

    不会吧,我用的SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardProc, g_hInstance, NULL );
    如果用WH_KEYBOARD,我上面的代码不要说2次,1次也不会执行呀.
    我觉得问题应该是出在键盘的按下和弹起的上面,就是不知道如何判断,谁能帮我改一下吗?
      

  2.   

    遗憾的是我没发现你的问题,除非连续按下,这样可能给人“隐藏后马上又显示出来”的错觉。另外我的程序这样写方可正常运行: if( HC_ACTION==nCode )
    {
    if( wParam == 0x41 && lParam & 0x20000000 )
    {
    if(...)
    {
    ...
    }
    else
    {
    ...
    }
    }
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam );
      

  3.   

    欧,sorry,原来你用的是这个类型,那你就好好的检查你的代码吧。我这么用过很好用的。你再详细的看一下MSDN。我的代码没法考给你,不再一台机器上
      

  4.   

    你看一下我写的这段代码 看队你又帮助吗?LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){     // 拦截键盘的某些按键, 如果 g_bDisableKeyboard 为 TRUE 则拦截整个键盘按键if (nCode >= HC_ACTION)     {         KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;         if (g_bDisableKeyboard)               if (g_lpfnKeyboardProc(wParam, pStruct))   return CallNextHookEx(g_hHook, nCode, wParam, lParam);              else                   return true;          LPDWORD tmpVirtualKey = g_lpdwVirtualKey;         for (int i = 0; i < g_nLength; i++)         {              if (pStruct->vkCode == *tmpVirtualKey++)                   if (g_lpfnKeyboardProc(wParam, pStruct))   return CallNextHookEx(g_hHook, nCode, wParam, lParam);                   else                       return true;         }              }          // 调用系统中的下一个钩子     return CallNextHookEx(g_hHook, nCode, wParam, lParam);}
      

  5.   

    按一个键时,KEYDOWN被HOOK了一次,KEYUP时又被HOOK了一次。
      

  6.   

    if (nCode == HC_ACTION)
    {
    // 一般都是这样写过滤多余的一次
    if (lParam & 0x80000000)
    {
    ......
    }
    }
      

  7.   

    to Snow_Ice11111(雪上加冰--求职ing在厦门):
    为什么我加了if (lParam & 0x80000000)后,反而一次也不能执行了?你看看我哪里出错了?LRESULT CALLBACK KeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
    {
    KBDLLHOOKSTRUCT *pStruct = (KBDLLHOOKSTRUCT*)lParam;
    if( HC_ACTION==nCode )
    {
    if (lParam & 0x80000000)
    {
    if( pStruct->vkCode == 0x53 && pStruct->flags & LLKHF_ALTDOWN )
    {
    AfxMessageBox( "OK" );
    if( ::IsWindowVisible( myHwnd ) )
    ::ShowWindow( myHwnd, SW_HIDE );
    else
    ::ShowWindow( myHwnd, SW_SHOW );
    }
    }
    } return CallNextHookEx( hHook, nCode, wParam, lParam );
    }
      

  8.   

    偶用一个全局变量解决。
    i=0
    KeyboardProc
    {
      i++;
      if(i==2)
      {
        //处理代码
        i=0;
      }
    }