2010-01-30 3 views
7

Je voudrais savoir s'il est possible d'utiliser la fonction de hook du clavier win32 (SetWindowsHookEx, SetWindowsHookEx) dans une application Qt.Est-il possible d'utiliser Win32 Hooks dans les applications Qt

Si possible, SVP fournit un exemple de code sur l'utilisation des fonctions SetWindowsHookEx, SetWindowsHookEx dans Qt.

// Mise à jour en date du 18 février 2010 //

Je nai compris comment le faire encore dans l'intervalle QT.

Mais en guise de solution de contournement, j'ai créé un dll win32 en utilisant l'édition vC++ express et placé mes commandes hook dans les fonctions dll. et je demande que les fonctions dll de Qt en utilisant la classe QLibrary

/* hearder file code*/ 
    QLibrary *myLib; 
    typedef HHOOK (*MyPrototype)(HINSTANCE); 

/* source file code */ 
    myLib = new QLibrary("ekhook.dll"); 
    MyPrototype myFunction; 
    myFunction = (MyPrototype) myLib->resolve("Init"); 

init() est la fonction dans thats ekhook.dll appelé

Répondre

1

Je crois qu'il est possible, oui. Utilisez QWidget::winId.

+1

Ce serait une aide précieuse si vous pouvez me faire savoir un exemple de code montrant comment utiliser Qwidget :: winId avec SetWindowsHookEx. Je ne suis pas sûr de savoir comment nous ces ensemble. – Mugunth

4

Je me demandais la même chose et trouvé ce enfin .. Le crédit va à Voidrealms.

La vidéo explique suffisamment pour faire une application de travail avec le code suivant ci-dessous.

//Copied Code from YouTube Video 

#include <QtCore/QCoreApplication> 
#include <QDebug> 
#include <QTime> 
#include <QChar> 
#include <iostream> 
#include <windows.h> 
#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(); 
} 
Questions connexes