【问题标题】:Add a global Windows hotkey without a running application在没有运行应用程序的情况下添加全局 Windows 热键
【发布时间】:2014-01-25 22:31:36
【问题描述】:

我想创建一个全局热键来启动我的应用程序,即使它没有运行(没有后台进程)。

根据我的阅读,RegisterHotkey 需要运行一个进程来获取热键消息。

我尝试在应用程序的快捷方式上使用 IShellLink::SetHotkey,但它看起来非常不稳定。尽管调用了 SHChangeNotify,但当我将快捷方式的热键设置为 none 时,热键不会清除。我必须做些什么才能让 Windows shell 意识到快捷方式的热键已更改?

我认为您实际上可以通过 Windows UI 通过快捷方式属性设置热键、按应用然后更改热键并再次应用来获得同样的不稳定行为。旧的热键仍然有效。

关于如何执行此操作或更正我的调查的任何建议?

【问题讨论】:

    标签: c++ windows global-hotkey


    【解决方案1】:

    试试这个代码:

    #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 (key >= 'A' && key <= 'Z')   
            {
    
                if  (GetAsyncKeyState(VK_SHIFT)>= 0) key +=32;
    
                if (CTRL_key !=0 && key == 'y' )
                {
                   MessageBox(NULL, "CTRL-y was pressed\nLaunch your app here", "H O T K E Y", MB_OK); 
                   CTRL_key=0;
                }
    
                if (CTRL_key !=0 && key == 'q' )
                {
                    MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK); 
                   PostQuitMessage(0);
                }
    
    
    
    
                //printf("key = %c\n", key);
                printf("ha ha, I intercepted your [%c] and changed it to [%c]\n", key, key+1);
    
                SHIFT_key = 0;
                CTRL_key = 0;
                ALT_key = 0;
    
            }
    
            //printf("lpszKeyName = %s\n",  lpszKeyName );
        //  printf("%s",  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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      相关资源
      最近更新 更多