gpt4 book ai didi

c# - 检测焦点变化并找到它 C#

转载 作者:行者123 更新时间:2023-11-30 22:19:55 27 4
gpt4 key购买 nike

我需要一个基础进程来收集有关 Windows 使用的其他应用程序的信息。我怀疑这可以使用 WAPI Hook 来完成。我想要做的是让我的程序检测 Windows 何时将焦点从一个程序更改为另一个程序并告诉我哪个程序当前具有焦点。

首先,我需要一个每次 Windows 在两个应用程序之间交换焦点时触发的事件。到目前为止,我发现的所有事件都只处理由它所使用的程序所做的更改或对它所使用的程序所做的更改,但我需要找到所有焦点更改,即使它在其他两个程序之间也是如此。

我还需要一个能使窗口处于焦点状态的函数。会 this工作,还是仅在内部(当前应用程序中的窗口而不是其他程序)?

干杯

最佳答案

根据您需要的焦点变化检测系统的准确度,您可以使用您描述的 API 函数 GetForegroundWindow 轮询前景窗口的服务(是的,这是系统范围内的,而不是特定于流程的)。

然后您可以使用该函数的句柄来确定哪个进程是当前的事件/焦点进程。然后检索该进程的焦点元素(子窗口)..

HWND hwnd = GetForegroundWindow();
DWORD remoteThreadId = GetWindowThreadProcessId(hwnd, NULL);
DWORD currentThreadId = GetCurrentThreadId();
AttachThreadInput(rThreadId, curThreadId, TRUE);
HWND focusElement = GetFocus();
AttachThreadInput(rThreadId, curThreadId, FALSE);

继续这样做......并使用 focusElement 做任何你需要做的事情

更新

显然,正如@Kenneth K. 在评论中发表的那样,有一个全局的 EVENT_SYSTEM_FOREGROUND 事件,您可以 Hook 该事件,以便在前景(聚焦的)窗口发生变化时通知您的应用程序。这样您就不需要连续循环来检测这些变化。

EVENT_SYSTEM_FOREGROUND = 3;
WINEVENT_OUTOFCONTEXT = 0;

可以关注example in this answer查看如何 Hook 此事件并获取通知。然后,每当前景(聚焦)窗口发生变化时,您可以 Hook 该窗口的消息循环,并使用 SetWindowsHookEx 查看该窗口中的焦点变化事件。功能。

另一种选择是咨询list of system events on MSDN看看是否有一个可以用来代替 EVENT_SYSTEM_FOREGROUND,或者与它一起检测控件级别的焦点事件。 EVENT_OBJECT_FOCUS 可能会有用。

如果还不清楚,请告诉我..

关于c# - 检测焦点变化并找到它 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15303294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com