我需要檢查何時啟動具有新的可見主視窗句柄的新行程(因為我的應用程式的滑鼠掛鉤在某些應用程式上丟失并且僅在短暫的內部重啟時恢復)。
我試過使用EnumWindows,EnumDesktopWindows但那些給了我很多我不需要的視窗和子視窗。我只需要可見的主視窗句柄。因此(并確定它們是否屬于新行程)我決定直接檢查自己的更新檢查執行緒中的行程。但這種方法(以及永久檢查 EnumWindows)非常消耗 CPU(在 Ryzen 5600X 上為 1-3%),在我看來,完全夸大了。
因此,我想知道是否有任何其他巧妙的方法來找出何時啟動任何新行程或打開視窗以僅在必要時執行檢查。
uj5u.com熱心網友回復:
輪詢從來都不是一個好的解決方案。
如果您已經掛鉤,為什么不使用WH_SHELL,WH_CBT或SetWinEventHook()?
uj5u.com熱心網友回復:
我通過在 .NET v4.5.2 中運行它并洗掉所有不必要的東西來使用/提取ApplicationWatcher來自這個包的小調整來解決它。
應用程式事件掛鉤僅適用于在事件掛鉤啟動后啟動的應用程式/視窗,這足以滿足我的目的。如果還需要所有現有視窗,您需要將所有現有視窗添加到類的activeWindows屬性中ApplicationWatcher。
此外,該WindowsActivated事件似乎被竊聽了。因此,您需要調整以下內容:
ApplicationWatcher班級內
private void WindowActivated(WindowData wnd) {
if (_ActiveWindows.ContainsKey(wnd.HWnd)) {
if (!_LastEventWasLaunched) { // < if condition adjusted
ApplicationStatus(_ActiveWindows[wnd.HWnd], ApplicationEvents.Activated);
}
}
_LastEventWasLaunched = false;
}
在ShellHook課堂上
protected override void WndProc(ref Message m) {
if (m.Msg == _wmShellHook) {
switch ((User32.ShellEvents)m.WParam) {
...
case User32.ShellEvents.HSHELL_RUDEAPPACTIVATED: // < line added
case User32.ShellEvents.HSHELL_WINDOWACTIVATED:
if (WindowActivated != null) {
WindowActivated.Invoke(this, m.LParam);
}
break;
}
}
base.WndProc(ref m);
}
作業得很好,我的 CPU 使用率下降到 0%。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/535525.html
標籤:C#视窗过程
