7


4

QtアプリケーションでWin32フックを使用することは可能ですか

Qtアプリケーションでwin32キーボードフック関数(SetWindowsHookEx、SetWindowsHookEx)を使用できるかどうかを知りたいです。

可能な場合、QtでSetWindowsHookEx、SetWindowsHookEx関数の使用に関するサンプルコードを提供してください。

私はまだQTでそれを行う方法を理解していません。

しかし、回避策として、vc ++ expressエディションを使用してwin32 dllを作成し、dllコマンド内にフックコマンドを配置しました。 Qdllクラスを使用してQtからそのdll関数を呼び出します

 /* 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()は、呼び出されるekhook.dllの関数です

3 Answer


5


私は同じことを疑問に思っていて、最終的にこれを見つけました.. クレジットはhttp://www.youtube.com/watch?v=O0C4V6JmlNw[Voidrealms]に送られます。

ビデオでは、以下のコードを使用して、実用的なアプリケーションを作成するのに十分な説明をしています。

//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();
}


3


Qtで何もする必要はありません。 Windowsの例に従ってください。


1


はい、可能だと思います。 QWidget::winIdを使用します。