GUI 自動化サービスの開発において、私たちのチームは WM_LBUTTONUP メッセージを正しく処理できないという問題に直面しました。
目標は、WM_LBUTTONUP をインターセプトし、アクティブなウィンドウを無効にし、仕事をして、YES ボタンと NO ボタンで MessageBox を表示することです。
- [はい] をクリックすると、手動で処理が行われます。
- それ以外の場合は何もしませんが、どちらの場合も、クリックされたウィンドウがこのメッセージを受信するのを防ぎ、フリーズしたウィンドウを有効にする必要があります。
WH_MOUSE_LL フックを使用しようとしましたが、クリックされたウィンドウは何かを行う前にクリックを受け取ります。WH_GETMESSAGE フックを使用しようとしましたが、すべてを行いますが、WM_LBUTTONUP を有効にした後、ユーザーが無効なウィンドウに個別に応答します。
メッセージ ループのコード (Service.exe 内):
int Loop()
{
do
{
if (PeekMessage(&MessagesQueue, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&MessagesQueue);
DispatchMessage(&MessagesQueue);
}
} while (true);
ResetHook();
return (int)MessagesQueue.wParam;
}
WH_MOUSE_LL (Service.dll 内) で使用されるコード:
LRESULT __stdcall HookProc(int code, WPARAM wParam, LPARAM lParam)
{
if (wParam == WM_LBUTTONUP && GetAsyncKeyState(VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1))
{
HWND w = GetForegroundWindow();
EnableWindow(w, FALSE);
// Do things right.
EnableWindow(w, TRUE);
SetForegroundWindow(w);
}
return CallNextHookEx(MouseHook, code, wParam, lParam);
}
HRESULT SetHook()
{
MouseHook = SetWindowsHookExW(WH_MOUSE_LL, HookProc, hDllModule, 0);
if (MouseHook == NULL)
{
wcout << L"MouseHook = NULL" << endl;
}
else
{
wcout << L"MouseHook is" << endl;
}
return (MouseHook == NULL) ? ::GetLastError() : NO_ERROR;
}
void ResetHook()
{
UnhookWindowsHookEx(MouseHook);
}
WH_GETMESSAGE (Service.dll 内) で使用されるコード:
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MSG* msg = (MSG*)lParam;
if (msg->message == WM_LBUTTONUP && GetAsyncKeyState(VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1))
{
HWND w = GetForegroundWindow();
EnableWindow(w, FALSE);
// Do things right.
EnableWindow(w, TRUE);
SetForegroundWindow(w);
}
}
私の質問は、WM_LBUTTONUP メッセージを傍受し、ターゲット ウィンドウがこのメッセージを受信しないようにする方法です。