ユーザーがWindowsボタンを押してマウスホイールを上下にスクロールすると、グローバルイベントをキャプチャする小さなツールを作成したいと思います。そのようなイベントがキャプチャされたら、Win- +またはWin-(プラス/マイナス)の仮想キーストロークの組み合わせに出力をリダイレクトしたいと思います。これはできますか?C#:グローバルマウス/ HIDイベントをキャプチャする方法
Windowsキーが予約されている場合は、ctrl-altなどを使用します。
ユーザーがWindowsボタンを押してマウスホイールを上下にスクロールすると、グローバルイベントをキャプチャする小さなツールを作成したいと思います。そのようなイベントがキャプチャされたら、Win- +またはWin-(プラス/マイナス)の仮想キーストロークの組み合わせに出力をリダイレクトしたいと思います。これはできますか?C#:グローバルマウス/ HIDイベントをキャプチャする方法
Windowsキーが予約されている場合は、ctrl-altなどを使用します。
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;
}
グローバルフックを使用して間違いなく行うことができます。hereは、これを行う方法の素晴らしいCodeProjectの例です。
うん、そうするよ。質問:(1)マウスXボタンのキーが表示されますが、ホイールのキーは表示されません。アクセスするには? (2)Windowsキーの重要な列挙名は何ですか? (3)特定のキーの組み合わせをシェルに出力するにはどうすればよいですか? – tsilb