Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测焦点的变化并找到它#_C#_Api_Window_Focus_Hook - Fatal编程技术网

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

C# 检测焦点的变化并找到它#,c#,api,window,focus,hook,C#,Api,Window,Focus,Hook,我需要一个底层进程来收集有关Windows使用的其他应用程序的信息。我怀疑这将使用WAPI挂钩来完成。我想做的是让我的程序检测windows何时将焦点从一个程序更改为另一个程序,并告诉我当前哪个程序有焦点 首先,我需要一个事件,每次Windows在两个应用程序之间交换焦点时都会触发该事件。到目前为止,我发现的所有事件只处理正在使用的程序所做的更改,但我需要找到所有焦点更改,即使是在其他两个程序之间 我还需要一个功能,让我在焦点窗口。是否可以工作,或者这只是内部操作(当前应用程序中的windows

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

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

我还需要一个功能,让我在焦点窗口。是否可以工作,或者这只是内部操作(当前应用程序中的windows而不是其他程序)


干杯

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

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

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 = 3;
WINEVENT_OUTOFCONTEXT = 0;
您可以按照查看如何挂钩此事件并获取通知。然后,无论前台(聚焦)窗口何时更改,都可以使用函数钩住该窗口的消息循环,并通过该窗口查看焦点更改事件

另一个选项是查阅,看看是否有一个可以用来代替事件\系统\前台,或者与之一起检测控制级焦点事件。事件\u对象\u焦点可能有用


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

您是指这样的东西吗?确实,我可以经常循环它以使其工作,但如果可能的话,我希望更高的精度。当两个应用程序之间的焦点发生变化时,是否会触发任何全局windows事件?