Is it possible to use Win32 Hooks in Qt applications

后端 未结 3 1698
一整个雨季
一整个雨季 2021-02-09 06:20

I like to know if its possible to use win32 keyboard hook function (SetWindowsHookEx , SetWindowsHookEx ) in a Qt application.

If possible pls provide a sample code on

3条回答
  •  南笙
    南笙 (楼主)
    2021-02-09 07:08

    I was wondering the same thing and found this finally.. Credit goes to Voidrealms.

    The video explains enough to make a working application with the following code below.

    //Copied Code from YouTube Video
    
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #pragma comment(lib, "user32.lib")
    
    HHOOK hHook = NULL;
    
    using namespace std;
    
    void UpdateKeyState(BYTE *keystate, int keycode) 
    {
        keystate[keycode] = GetKeyState(keycode); 
    }
    
    LRESULT CALLBACK MyLowLevelKeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam) 
    {
        //WPARAM is WM_KEYDOWn, WM_KEYUP, WM_SYSKEYDOWN, or WM_SYSKEYUP
        //LPARAM is the key information
    
        qDebug() << "Key Pressed!";
    
        if (wParam == WM_KEYDOWN)
        {
            //Get the key information
            KBDLLHOOKSTRUCT cKey = *((KBDLLHOOKSTRUCT*)lParam);
    
            wchar_t buffer[5];
    
            //get the keyboard state
            BYTE keyboard_state[256];
            GetKeyboardState(keyboard_state);
            UpdateKeyState(keyboard_state, VK_SHIFT);
            UpdateKeyState(keyboard_state, VK_CAPITAL);
            UpdateKeyState(keyboard_state, VK_CONTROL);
            UpdateKeyState(keyboard_state, VK_MENU);
    
            //Get keyboard layout
            HKL keyboard_layout = GetKeyboardLayout(0);
    
            //Get the name
            char lpszName[0X100] = {0};
    
            DWORD dwMsg = 1;
            dwMsg += cKey.scanCode << 16;
            dwMsg += cKey.flags << 24;
    
            int i = GetKeyNameText(dwMsg, (LPTSTR)lpszName, 255);
    
            //Try to convert the key information
            int result = ToUnicodeEx(cKey.vkCode, cKey.scanCode, keyboard_state, buffer, 4, 0, keyboard_layout);
            buffer[4] = L'\0';
    
            //Print the output
            qDebug() << "Key: " << cKey.vkCode << " " << QString::fromUtf16((ushort*)buffer) << " " << QString::fromUtf16((ushort*)lpszName);
    
        }
    
        return CallNextHookEx(hHook, nCode, wParam, lParam); 
    }
    
    int main(int argc, char *argv[]) 
    {
        QCoreApplication a(argc, argv);
    
    
        hHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);
        if (hHook == NULL)
        {
            qDebug() << "Hook Failed" << endl;
        }
    
        return a.exec(); 
    }
    

提交回复
热议问题