2014-11-14 53 views
1

这段代码在Windows下为SHIFT + F5和SHIFT + F6注册了2个全局热键,它在任何情况下都能正常工作,包括完全其他应用程序具有例如游戏焦点。在C++中没有修饰符的RegisterHotKey

enum{ KEY_F5 = 1, KEY_F6 = 2 }; 
RegisterHotKey(0, KEY_F5, MOD_SHIFT, VK_F5); 
RegisterHotKey(0, KEY_F6, MOD_SHIFT, VK_F6); 
MSG msg; 
while (GetMessage(&msg, 0, 0, 0)) 
{ 
    PeekMessage(&msg, NULL, 0, 0, 0); 
    switch (msg.message){ 

    case WM_HOTKEY: 
     if (msg.wParam == KEY_F5){ 
      // code 
     } 
     else if (msg.wParam == KEY_F6){ 
      // code 
     } 
    } 
} 

但是,如果我更换

RegisterHotKey(0, KEY_F5, MOD_SHIFT, VK_F5); 
RegisterHotKey(0, KEY_F6, MOD_SHIFT, VK_F6); 

通过

RegisterHotKey(0, KEY_F5, 0, VK_F5); 
RegisterHotKey(0, KEY_F6, 0, VK_F6); 

,因为我的目标是两人F5和F6的快捷键,而不必总是按SHIFT键,它只能如果我的程序的重点不在于其他方面。我怎样才能达到只有F?就像TS3那样的全球热键。即使应用程序没有焦点,它也必须工作。

+0

为什么你的代码显示你注册一个热键为'KEY_F5',但检查'ONE_KEYID'? – 2014-11-14 13:51:17

+1

您需要确保您的应用的卸载程序运行良好。它会得到很多用途。 – 2014-11-14 14:19:52

回答

0

尝试使用MOD_NOREPEAT而不是MOD_SHIFT。我也没有看到使用“PeakMessage”的必要性。由于您已致电GetMessage(),因此PeakMessage确实是多余的。