Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何捕获CTRL+;空间+;空格键_C++_Win32gui - Fatal编程技术网

C++ 如何捕获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执行此操作,您必须通过以下方式处理两级热键: 在某个地方

如何捕获按ctrl+space+space的用户

我使用以下代码成功测试了ctrl+空格:

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 Hill
VK_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 Hill
VK_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是错误的函数。