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

时间:2013-03-08 21:06:27

标签: c# api window focus hook

我需要一个基础流程来收集有关Windows使用的其他应用程序的信息。我怀疑这将使用WAPI钩子完成。我想要做的是让我的程序检测窗口何时将焦点从一个程序转移到另一个程序并告诉我哪个程序目前有焦点。

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

我还需要一个能让我关注窗口的函数。 this会工作,还是仅在内部(当前应用程序中的窗口而不是其他程序)?

干杯

1 个答案:

答案 0 :(得分:3)

根据您需要的焦点变化检测系统的准确程度,您可以使用您描述的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 事件可以挂钩,以便在前景(聚焦)窗口发生变化时通知应用程序。这样您就不需要连续循环来检测这些变化。

EVENT_SYSTEM_FOREGROUND = 3;
WINEVENT_OUTOFCONTEXT = 0;

您可以按照example in this answer查看如何挂钩此活动并获取通知。然后,每当前景(聚焦)窗口发生变化时,您可以使用SetWindowsHookEx函数挂钩该窗口的消息循环并使用该窗口查看表单焦点更改事件。

另一个选项是咨询list of system events on MSDN并查看是否有一个可以使用而不是 EVENT_SYSTEM_FOREGROUND ,或者与它一起检测控制级焦点事件。也许 EVENT_OBJECT_FOCUS 可能很有用。

如果目前还不清楚,请告诉我。

相关问题