需Hook哪个WINAPI可阻止Chrome经PostMessage点击时被激活?
Hook PostMessage发送Chrome点击事件时阻止窗口激活的问题
我正在使用EasyHook对google chrome进行Hook,目标是通过PostMessage向Chrome发送点击事件时阻止窗口被激活。
我已经Hook了WM_WINDOWPOSCHANGING消息,尝试强制移除SWP_NOACTIVATE | SWP_NOZORDER标志,但发送如下点击代码时,窗口仍然会被激活:
lParam = MAKELPARAM(x, y); PostMessageW(hWnd, WM_LBUTTONDOWN, 0x0001, lParam); PostMessageW(hWnd, WM_LBUTTONUP, 0, lParam);
我已经确认Hook本身运行正常,问题核心是需要找到正确的可Hook/拦截的WINAPI接口。
当前Hook实现代码如下:
typedef LRESULT __stdcall DefDlgProcWFunc(HWND, UINT, WPARAM, LPARAM); // 最内层Hook处理函数 LRESULT __stdcall DefDlgProcW_Hook(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { DefWindowProcW_Msg(hWnd, Msg, wParam, lParam, 1); // 最内层Hook直接调用原始函数 return DefDlgProcW(hWnd, Msg, wParam, lParam); } void DefWindowProcW_Msg(HWND hWnd, UINT& Msg, WPARAM& wParam, LPARAM& lParam, int CalledByFunction) { if (!hooks_enabled) return; std::wstringstream str; HWND hwnd = nullptr; HWND hwndInsertAfter = nullptr; tagWINDOWPOS* wp; int x; int y; int cx; int cy; UINT flags; switch (Msg) { case WM_WINDOWPOSCHANGING: { wp = reinterpret_cast<tagWINDOWPOS*>(lParam); hwnd = wp->hwnd; hwndInsertAfter = wp->hwndInsertAfter; x = wp->x; y = wp->y; cx = wp->cx; cy = wp->cy; flags = wp->flags; HWND hWnd2 = FindWindow(0, L"New Tab - Google Chrome"); str << L"\nWM_WINDOWPOSCHANGING" << L"\nx: " << x << L" y: " << y << L"\nw: " << cx << L" h: " << cy << L"\nhwnd: " << hwnd << L"\nflags: " << flags << L"\n"; OutputDebugString(str.str().c_str()); if (hWnd == hWnd2) { OutputDebugString(L"CHROME!!!!\n"); wp->flags &= ~(SWP_NOACTIVATE | SWP_NOZORDER); return; } return; } } }
已测试的方案及缺陷
- 调用
LockSetForegroundWindow方案:可以实现效果,但必须在发送消息前后分别执行加锁/解锁操作,加锁状态下点击任务栏无法激活任何窗口,副作用明显。 SetWinEventHook监听EVENT_SYSTEM_FOREGROUND事件方案:完全无效,事件触发时窗口已经完成前台切换,没有拦截时机。- Hook
SetForegroundWindow:Chrome激活窗口时并未调用该接口,Hook不生效。
发送PostMessage点击后触发的所有窗口消息已做全量日志记录,日志覆盖了点击操作触发的全部窗口消息流程。
实现约束
仅通过PostMessage实现需求,不使用UI Automation/JavaScript相关方案。
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

