0

ユーザーが Windows ボタンを押してマウスホイールを上下にスクロールしたときにグローバル イベントをキャプチャする小さなツールを作成したいと考えています。そのようなイベントがキャプチャされたら、その出力を Win-+ または Win-- (プラス/マイナス) の仮想キーストロークの組み合わせにリダイレクトしたいと考えています。これはできますか?

Windows キーが予約されている場合は、ctrl-alt などで十分です。

4

2 に答える 2

1

Windows キーを使用するため、キーはホットキー バインドを使用してグローバルにキャプチャできます。msdnで HotKey を登録します。

編集:私が想定したように、マウスホイールイベントはキーとして扱われず、グローバルホットキーを作成する方法がないようです。

グローバル ウィンドウ メッセージ フックを作成し、WM_MOUSEWHEEL メッセージをトラップする必要があります。ただし、C/C++ でそれを行う必要がある場合があります。これを実現するための AC dll は以下のとおりです。C# から Hook および Unhook を呼び出して、機能を有効または無効にすることができます。

警告: 私はこのコードをテストしておらず、デモンストレーションとしてのみ提供されています。

#include <windows.h>

HINSTANCE myInstance;
HHOOK thehook = 0;
BOOL isWinKeyDown = FALSE;

extern "C" LRESULT __declspec(dllexport)__stdcall CALLBACK HookHandler(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == WM_KEYDOWN && (wParam == VK_LWIN || wParam == VK_RWIN))
        isWinKeyDown = TRUE;
    else if (nCode == WM_KEYUP && (wParam == VK_LWIN || wParam == VK_RWIN))
        isWinKeyDown = FALSE;
    else if (nCode == WM_MOUSEHWHEEL && isWinKeyDown) {
        if (HIWORD(wParam) > 0) { //mousewheel up
            CallNextHookEx(thehook, WM_KEYDOWN, VK_ADD, 0);
            CallNextHookEx(thehook, WM_KEYUP, VK_ADD, 0);
        } else { //mousewheel down
            CallNextHookEx(thehook, WM_KEYDOWN, VK_SUBTRACT, 0);
            CallNextHookEx(thehook, WM_KEYUP, VK_SUBTRACT, 0);
        }
        return 0;
    }
    return CallNextHookEx(thehook, nCode, wParam, lParam);
}
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD fwdReason, LPVOID lpvReserved) {
    switch(fwdReason)
    {
        case DLL_PROCESS_ATTACH: {
            DisableThreadLibraryCalls(hInstance);
            myInstance = hInstance;

            } break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_PROCESS_DETACH:

            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return(TRUE);               // The initialization was successful, a FALSE will abort
                                // the DLL attach
}

extern "C" void __declspec(dllexport) Hook() {
    if (!thehook)
        thehook = SetWindowsHookEx(WH_CALLWNDPROC, &HookHandler, myInstance, 0);
}
extern "C" void __declspec(dllexport) UnHook() {
    if (thehook)
        UnhookWindowsHookEx(thehook);
    thehook = 0;
}
于 2009-04-14T03:08:50.753 に答える
0

グローバルフックを介して確実に実行できますこれは、その方法に関する優れた CodeProject の例です。

于 2009-04-14T03:02:35.667 に答える