Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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# 查找当前的Windows应用程序_C#_Windows - Fatal编程技术网

C# 查找当前的Windows应用程序

C# 查找当前的Windows应用程序,c#,windows,C#,Windows,我想写一个简单的应用程序跟踪器。也就是说,每当一个新的应用程序启动,或者一个正在运行的应用程序成为当前应用程序时,我想记录事件并开始计时,它的时间“在顶部” 我有列出当前运行的所有应用程序的代码,还有一些告诉我顶部窗口的代码(当然总是我的测试控制台应用程序) 我想我缺少的是要监视的Windows事件流之类的东西 我正在使用.NET(C#首选) 有任何提示、提示或欺骗吗 谢谢-Jonathan我不确定是否有办法钩住Windows事件,但只要定期(比如100毫秒)轮询System.Diagnosti

我想写一个简单的应用程序跟踪器。也就是说,每当一个新的应用程序启动,或者一个正在运行的应用程序成为当前应用程序时,我想记录事件并开始计时,它的时间“在顶部”

我有列出当前运行的所有应用程序的代码,还有一些告诉我顶部窗口的代码(当然总是我的测试控制台应用程序)

我想我缺少的是要监视的Windows事件流之类的东西

我正在使用.NET(C#首选)

有任何提示、提示或欺骗吗


谢谢-Jonathan

我不确定是否有办法钩住Windows事件,但只要定期(比如100毫秒)轮询System.Diagnostics.Process.GetProcesss()并查找新的/删除的进程(通过进程ID进行比较)就可以了。另外,Process.StartTime将为您提供进程开始的时间


警告:与基于事件的方法相比,此方法可能需要更高的处理量(我不知道)。在每次轮询之间开始和结束的进程将不会被观察到,但对于一个相当高的轮询频率来说,这应该是非常罕见的(也许您根本不关心这些进程)。这么说来,这些都是小缺点,我建议您至少测试一下这个解决方案,因为它相当简单。

我认为最好的方法是使用windows“挂钩”(即)。这些功能允许您连接到windows核心功能,特别是有一个名为
WH_CALLWNDPROC
的功能,它可以在系统中的任何窗口收到消息时调用用户函数

您可以使用它全局侦听将窗口带到前台的消息和/或用于用户交互的消息(鼠标、键盘)


但是,这是一个原始的Windows API函数,主要用于C/C++Windows DLL。您可以在C#中实现它,但这可能是您不想打开的蠕虫。但是打开它可能是做你想做的事情的最好方式。

这是一个越来越严重的问题,被否决的答案是正确的。确实需要SetWindowsHookEx()才能捕获激活窗口获得的WM_ACTIVATE消息。但这需要一个WH_CALLWNDPROC或WH_SHELL钩子,这些钩子不能在C中实现。捕获这些需要在每个进程中注入DLL,托管程序集不能注入到另一个进程中。无法初始化CLR


+1让诺多林把他带回0,这就是我能做的。OP需要用非托管C/C++编写代码,创建DLL,并使用标准IPC机制(如管道或套接字)通知主机应用程序。或者投票,简单得多。

我曾经写过一个小应用程序,用来记录我自己的工作习惯。我所做的是周期性地(每5秒或其他时间)调用并记录正在运行的应用程序。您可以从窗口句柄获得大量信息,不仅是标题,还可以一直到创建它的实际过程。

这就是我使用Java的JNA所做的:

final HWND child = User32Ext.INSTANCE.GetForegroundWindow();
final int length = User32.INSTANCE.GetWindowTextLength(child) * 2;
final byte[] buffer = new byte[length];
User32.INSTANCE.GetWindowText(child, buffer, length);
title = new String(buffer, Charset.forName("UTF-16LE"));
其中User32Ext是我所做的扩展,因为User32(在JNA的发行版中)没有以下接口:

LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam);

我会定期轮询活动窗口,因为我无法使用中提到的HCBT_SETFOCUS钩子,如果有人提出解决方案,我会非常感兴趣。

不过,如果该轮询碰巧捕捉到一个特定的应用程序,比如MSN Messenger,在连续两次轮询中,用户看起来像是(假设这是为了跟踪员工)花时间在MSN上,而他们可能只是碰巧在错误的时间被调查了两次。我想你误解了。调查的频率相对较高(>1Hz)。我不认为这会过于处理器密集。诚然,这可能并不理想,但除非OP没有提到某些其他要求,否则这是一个有效的解决方案。是的,我确实误解了你的意图。尽管如此,我认为我这样做是因为我本能地排除了以足够高的频率生成THO的轮询伪即时结果不是很好。是的,我想这有点含糊不清。答案已经被编辑以澄清这一点。是的,创建通知/事件系统将需要DLL注入(据我所知)。最好尽可能避免DLL注入(这是相当讨厌的东西),但如果您真的想这样做,请查看Sourceforge-(续)上的Console项目。Console项目使用共享内存在主机进程和子控制台进程之间进行通信,这很有效,但也不太好处理@nobugz,谢谢您的支持。您可以按照我的建议使用托管代码和“EasyHook”库: