2013-10-31 29 views
-1

如何捕捉按下“ctrl +空格+空格”的用户!如何捕捉CTRL +空格+空格按键

我成功地测试了 “Ctrl +空格键”,此代码:

RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE); 
+5

你怎么能按两个空格键? –

+4

您是否已将'device = dblspace.exe'添加到autoexec.bat中? –

+0

我假设你的意思是“按空格+ ctrl,然后再按空格”。是对的吗? –

回答

4

即传统上被写Ctrl+Space, Space。即按Ctrl + 空间,然后按空间

首先,RegisterHotKey是系统范围的。如果您只想在应用程序中使用多级键盘快捷键,则不应使用RegisterHotKey。

其次,你不能RegisterHotKey做到这一点,你必须处理两级热键:

  • 设置一个变量的地方说,一个多层次的热键已经开始,它是什么。
  • 编写全球键盘钩子,其执行以下操作

    • 检查热键已经开始,如果不是再正常不过的行为,否则
    • 检查热键的下半年。如果匹配,请执行正确的操作。
    • 无论匹配与否,取消“热键待处理”状态。

你可以注册键盘钩子只有当按下热键,并随后注销,或离开它的全部时间。

+0

我试过RegisterHotKey(0,1,MOD_CONTROL | VK_SPACE,VK_SPACE)但没有结果,是什么问题!!! – yasso

+3

@yasso,问题是RegisterHotKey **不能做**你想要的。要做你想做的事,你需要阅读我在答案中写的内容。此外,如果这仅仅是用户使用应用程序时,RegisterHotKey是错误的功能。 – Ben

0

使用GetAsyncKeyState(VK_CONTROL)捕捉CTRL同时击中空格键..

if (GetAsyncKeyState(VK_CONTROL) !=0 && key == VK_SPACE) 
    { 
     MessageBox(NULL, "CTRL-SPACE was pressed\nDo something in here", 
     "H O T K E Y", MB_OK); 
     CTRL_key=0; 
    } 

完整代码捕获CTRL-SPACE:

#define _WIN32_WINNT 0x0400 
#pragma comment(lib, "user32.lib") 

#include <windows.h> 
#include <stdio.h> 

HHOOK hKeyboardHook; 

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    DWORD SHIFT_key=0; 
    DWORD CTRL_key=0; 
    DWORD ALT_key=0; 

    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN))) 
    { 
     KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); 
     DWORD dwMsg = 1; 
     dwMsg += hooked_key.scanCode << 16; 
     dwMsg += hooked_key.flags << 24; 
     char lpszKeyName[1024] = {0}; 
     lpszKeyName[0] = '['; 

     int i = GetKeyNameText(dwMsg, (lpszKeyName+1),0xFF) + 1; 
     lpszKeyName[i] = ']'; 

     int key = hooked_key.vkCode; 

     SHIFT_key = GetAsyncKeyState(VK_SHIFT); 
     CTRL_key = GetAsyncKeyState(VK_CONTROL); 
     ALT_key = GetAsyncKeyState(VK_MENU); 


     if (GetAsyncKeyState(VK_CONTROL) !=0 && key == VK_SPACE) 
      { 
       MessageBox(NULL, "CTRL-SPACE was pressed\nDo something in here", "H O T K E Y", MB_OK); 
       CTRL_key=0; 
      } 



     printf("lpszKeyName = %s\n", lpszKeyName); 
    } 
    return CallNextHookEx(hKeyboardHook, nCode,wParam,lParam); 
} 

void MessageLoop() 
{ 
    MSG message; 
    while (GetMessage(&message,NULL,0,0)) 
    { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
} 

DWORD WINAPI my_HotKey(LPVOID lpParm) 
{ 
    HINSTANCE hInstance = GetModuleHandle(NULL); 
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1; 

    hKeyboardHook = SetWindowsHookEx ( WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent, hInstance, NULL ); 
    MessageLoop(); 
    UnhookWindowsHookEx(hKeyboardHook); 
    return 0; 
} 

int main(int argc, char** argv) 
{ 
    HANDLE hThread; 
    DWORD dwThread; 

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE) my_HotKey, (LPVOID) argv[0], NULL, &dwThread); 

    //ShowWindow(FindWindowA("ConsoleWindowClass", NULL), false); 

    if (hThread) return WaitForSingleObject(hThread,INFINITE); 
    else return 1; 

}