使用 CreateProcess 啟動 360 瀏覽器,嘗試通過 EnumWindows 找到主窗口並 PostMessage(hwnd, WM_CLOSE, 0, 0) 關閉,但瀏覽器無反應。
EnumWindows 遍歷到的可能是子窗口(如渲染進程窗口),而非主窗口。360 瀏覽器多進程架構,主窗口隸屬於 Browser 進程。PostMessage 會被 UIPI 阻攔。WM_CLOSE 並最小化到托盤而非退出。GetWindowThreadProcessId 邏輯。WM_SYSCOMMAND, SC_CLOSE 模擬點擊關閉按鈕。SendMessageTimeout 配合 SMTO_ABORTIFHUNG 避免死鎖。IUIAutomation 尋找「關閉」按鈕並 InvokePattern 點擊,繞過消息層。--close-window 等參數,直接 CreateProcess 帶參數啟動。TerminateProcess,但會導致數據丟失、會話未正常保存。#include
// ... 初始化 COM、獲取 IUIAutomation ...
IUIAutomationElement* root;
automation->GetRootElement(&root);
IUIAutomationCondition* cond;
automation->CreatePropertyCondition(UIA_NamePropertyId, SysAllocString(L"關閉"), &cond);
IUIAutomationElement* closeBtn;
root->FindFirst(TreeScope_Subtree, cond, &closeBtn);
IInvokeProvider* invoke;
closeBtn->GetCurrentPattern(UIA_InvokePatternId, (IUnknown**)&invoke);
invoke->Invoke();
// 釋放介面...