C++ 如何捕获CTRL+;空间+;空格键
如何捕获按ctrl+space+space的用户 我使用以下代码成功测试了ctrl+空格:C++ 如何捕获CTRL+;空间+;空格键,c++,win32gui,C++,Win32gui,如何捕获按ctrl+space+space的用户 我使用以下代码成功测试了ctrl+空格: RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE); 这是传统上编写的Ctrl+Space,Space。也就是说,按Ctrl+Space,然后按Space 首先,RegisterHotKey是全系统的。如果您只想在应用程序中使用多级键盘快捷键,则不应使用注册表快捷键 其次,您不能使用RegisterHotKey执行此操作,您必须通过以下方式处理两级热键: 在某个地方
RegisterHotKey(0, 1, MOD_CONTROL, VK_SPACE);
这是传统上编写的
Ctrl+Space,Space
。也就是说,按Ctrl+Space,然后按Space
首先,RegisterHotKey是全系统的。如果您只想在应用程序中使用多级键盘快捷键,则不应使用注册表快捷键
其次,您不能使用RegisterHotKey执行此操作,您必须通过以下方式处理两级热键:
- 在某个地方设置一个变量,表示多级热键已经开始,以及它是什么
- 编写一个全局键盘钩子,它执行以下操作
- 检查热键是否已开始,如果未开始,则检查正常行为,否则
- 检查热键的后半部分。如果匹配,请执行正确的操作李>
- 无论是否匹配,取消“热键挂起”状态
您可以仅在按下热键时注册键盘挂钩,然后取消注册,或将其一直保留。这是传统上编写的
Ctrl+Space,Space
。也就是说,按Ctrl+Space,然后按Space
首先,RegisterHotKey是全系统的。如果您只想在应用程序中使用多级键盘快捷键,则不应使用注册表快捷键
其次,您不能使用RegisterHotKey执行此操作,您必须通过以下方式处理两级热键:
- 在某个地方设置一个变量,表示多级热键已经开始,以及它是什么
- 编写一个全局键盘钩子,它执行以下操作
- 检查热键是否已开始,如果未开始,则检查正常行为,否则
- 检查热键的后半部分。如果匹配,请执行正确的操作李>
- 无论是否匹配,取消“热键挂起”状态
GetAsyncKeyState(VK_控件)
在按下空格键时捕获CTRL键
捕获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;
}
#定义_WIN32_WINNT 0x0400
#pragma注释(lib,“user32.lib”)
#包括
#包括
HHOOK-hKeyboardHook;
__declspec(dllexport)LRESULT回调键盘事件(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
DWORD SHIFT_键=0;
DWORD CTRL_键=0;
DWORD ALT_键=0;
if((nCode==HC_ACTION)&&((wParam==WM_SYSKEYDOWN)| |(wParam==WM_KEYDOWN)))
{
KBDLLHOOKSTRUCT hooked_key=*((KBDLLHOOKSTRUCT*)LPRAM);
DWORD dwMsg=1;
dwMsg+=hooked_key.scanCode点击空格键时,使用GetAsyncKeyState(VK_控件)
捕捉CTRL键
捕获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;
}
#定义_WIN32_WINNT 0x0400
#pragma注释(lib,“user32.lib”)
#包括
#包括
HHOOK-hKeyboardHook;
__declspec(dllexport)LRESULT回调键盘事件(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
DWORD SHIFT_键=0;
DWORD CTRL_键=0;
DWORD ALT_键=0;
if((nCode==HC_ACTION)&&((wParam==WM_SYSKEYDOWN)| |(wParam==WM_KEYDOWN)))
{
KBDLLHOOKSTRUCT hooked_key=*((KBDLLHOOKSTRUCT*)LPRAM);
DWORD dwMsg=1;
dwMsg+=hooked_key.scanCode你怎么能按两个空格键?你是否将device=dblspace.exe
添加到你的autoexec.bat?使用注册表快捷键(0,1,MOD_控件,VK_space |两个手指)@ErnestFriedman HillVK_SPACE | VK_SPACE
的按键次数少于VK_SPACE |两个手指
。您可以使用方便的宏VK_SPACES
(注意S
)还有。@yasso除了第一条评论外,所有评论都是笑话。你的请求毫无意义。按Ctrl+Space+Space是不可能的,因为键盘上没有两个空格键。你的意思是Ctrl+Space,Space吗?你怎么能按两个空格键?你是否将device=dblspace.exe
添加到你的autoexec.bat中?使用RegisterHotKey(0,1,MOD_CONTROL,VK_SPACE |两个手指)@ErnestFriedman HillVK_SPACE | VK_SPACE
比VK_SPACE |两个手指
的按键次数少。您可以使用方便的宏VK_SPACES
(注意S
)还有。@yasso除了第一条评论外,所有评论都是笑话。你的请求毫无意义。按Ctrl+Space+Space是不可能的,因为键盘上没有两个空格键。你是说Ctrl+Space,Space吗?我试过RegisterHotKey(0,1,MOD|u CONTROL | VK| u Space,VK|u Space)但是没有结果,问题是什么!!!@yasso,问题是RegisterHotKey不能做你想做的事。要做你想做的事,你需要阅读我在回答中写的内容。另外,如果这只是为了用户使用你的应用程序,RegisterHotKey是错误的函数。我尝试了RegisterHotKey(0,1,MOD|u控件| VK| u空间,VK|u空间)但是没有结果,问题是什么!!!@yasso,问题是RegisterHotKey不能做你想做的事。要做你想做的事,你需要阅读我在回答中写的内容。而且,如果这只是为了用户使用你的应用程序,RegisterHotKey是错误的函数。