我写了一个全局钩子。当按F12时,模拟键盘输入'w'。
部分代码如下:LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
if(VK_F12==wParam)
{
keybd_event(0x57,0,0,0);
keybd_event(0x57,0,KEYEVENTF_KEYUP,0);
return 1;
}
else
{
return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
}
}运行的时候,问题来了。我每按一次F12,会出现2个'w',为什么?怎么解决?

解决方案 »

  1.   

     if(VK_F12==wParam) 这里有没有down和up区分?
      

  2.   

    一次key down和key up才是一次完整的点击过程……
      

  3.   

    MSG* pMsg = (MSG*)lParam;
    if (pMsg->message == WM_KEYDOWN)
    {
    //...
    }
    else if (pMsg->message == WM_KEYUP)
    {
    //...
    }
      

  4.   

    LRESULT CALLBACK KeyboardProc(
      int code,       // hook code
      WPARAM wParam,  // virtual-key code
      LPARAM lParam   // keystroke-message information
    )
    {
        if((VK_F12==wParam) && (lParam & 0x80000000)==0))
        {
            keybd_event(0x57,0,0,0);
            keybd_event(0x57,0,KEYEVENTF_KEYUP,0);
            return 1;
        }
        else
        {
            return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
        }
    }按2个w是应为 键盘DOWN会按一下 UP也会按一下 ,做个判断就行了 
      

  5.   

    3楼的方法试了,不好使。
    4楼你的方法可以,谢谢。
    lParam & 0x80000000是UP 还是DOWN ?
    UP和DOWN分别如何表示?
      

  6.   

    lParam & 0x80000000 
    lParam & 0x40000000 
    一个UP 一个DOWN ,你测试下 按住那个键 有字出来的就是DWON,
      

  7.   

    给你一段完整代码:
    #pragma data_seg(push, "Shared")
    HHOOK NextHook = NULL;
    #pragma data_seg(pop)
    #pragma comment(linker, "/SECTION:Shared,RWS")HMODULE Module;BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
    Module = hModule;
        return TRUE;
    }LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam)
    {
    if (code == HC_ACTION)
    {
    PMSG msg = (PMSG)lParam;
    if (msg->message == WM_KEYDOWN || msg->message == WM_KEYUP)
    {
    if (msg->wParam == VK_F12)
    {
    msg->wParam = 'W';
    }
    }
    }
    return CallNextHookEx(NextHook, code, wParam, lParam);
    }__declspec(dllexport) void StartHook()
    {
    NextHook = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, Module, 0);
    }__declspec(dllexport) void StopHook()
    {
    UnhookWindowsHookEx(NextHook);
    }
      

  8.   

    我翻了翻书,知道是怎么回事了。lParam的30位是键的先前状态,31位是转换状态。当键被按下时,31位始终为0;当键被松开时,其转换为1。6楼的说法不对。