2

キーボードがアプリケーションに送信するキーを変更しようとしています。すでにグローバルフックを作成していて、必要なキーを防ぐことができますが、新しいキーを所定の場所に送信したいと思います。これが私のフック手順です:

LRESULT __declspec (dllexport) HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    int ret;

    if(nCode < 0)
    {
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }

    kbStruct = (KBDLLHOOKSTRUCT*)lParam;

    printf("\nCaught [%x]", kbStruct->vkCode);

    if(kbStruct->vkCode == VK_OEM_MINUS)
    {
        printf(" - oem minus!");
        keybd_event(VK_DOWN, 72, KEYEVENTF_KEYUP, NULL);
        return -1;
    }
    else if(kbStruct->vkCode == VK_OEM_PLUS)
    {
        printf(" - oem plus!");
        keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL);
        return -1;
    }

    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

GetFocus()およびGetForegroudWindow()でSendMessageおよびPostMessageを使用しようとしましたが、WM_KEYUPまたはWM_KEYDOWNのLPARAMを作成する方法がわかりません。また、keybd_event()も試しました。これは、5つまたは6つの異なるスキャンコードを含むキーをシミュレートします(このフックプロシージャはシミュレートされたキーの押下をキャッチするためです)が、フォアグラウンドウィンドウには何も影響しません。

基本的に、ms3200のズームバーをスクロールコントロールに変えようとしているので、間違ったキー(UPとDOWN)を送信している可能性があります。

4

3 に答える 3

2

keybd_event の呼び出しは正しいです。キーを押しているだけの場合は、代わりにウィンドウがキーを押したメッセージを処理している可能性があります。キーダウンに続いてキーアップを送信する必要があります。

keybd_event(VK_UP, 75, 0, NULL);
keybd_event(VK_UP, 75, KEYEVENTF_KEYUP, NULL);

または、さらに良いのは、OEM キーがダウンしたときにキーを送信し、OEM キーがアップしたときにキーを送信することです。kbStruct->flags & LLKHF_UP でダウン/アップ状態を知ることができます。

于 2009-01-31T00:02:42.120 に答える
1

keybd_eventが置き換えられたため、SendInputを使用することをお勧めします。MSDN Magazine の記事C++ Q&A: Sending Keystrokes to Any Appに役立つ例があります。

于 2009-03-11T15:31:28.427 に答える
0

Up と Down の代わりに、Control-UpArrow と Control-DownArrow を試してみてください。ただし、これはすべてのアプリケーションで機能するわけではないようです。また、機能するアプリケーションであっても、焦点がどこにあるかによって異なります。

于 2009-01-31T02:15:57.983 に答える