2009-04-14 5 views
0

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

Windowsキーが予約されている場合は、ctrl-altなどを使用します。

答えて

1

Windowsキーを使用しているため、キーはホットキーバインディングを使用してグローバルにキャプチャできます。 RegisterHotKey at msdn

編集:mousewheelイベントは私が想定したようにキーとして扱われないと思われ、グローバルホットキーを作成する方法はありません。

グローバルウィンドウのメッセージフックを作成し、WM_MOUSEWHEELメッセージをトラップする必要があります。しかし、あなたはC/C++でそれをしなければならないかもしれません。これを達成するためのC 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; 
} 
+0

うん、そうするよ。質問:(1)マウスXボタンのキーが表示されますが、ホイールのキーは表示されません。アクセスするには? (2)Windowsキーの重要な列挙名は何ですか? (3)特定のキーの組み合わせをシェルに出力するにはどうすればよいですか? – tsilb

0

グローバルフックを使用して間違いなく行うことができます。hereは、これを行う方法の素晴らしいCodeProjectの例です。

関連する問題