我正在WPF应用程序上监视我的计算机上的活动。 我使用Process.GetProcesses()和一些过滤来获得我感兴趣的过程(例如:计算器),然后logging他们的StartTime。 我也使用WIN32 / USER32 API方法GetForegroundWindow()来获取用户正在使用的窗口。
问题是当Windows是Windows / UWP应用程序时,它们总是由ApplicationFrameHost进程托pipe。 所以GetForegroundWindow()方法返回带有标题的窗口(例如:Calculator),但不是托pipe的真实进程。
我需要的是以另一种方式获得包含真实进程的前台窗口,或者以某种方式连接窗口进行处理。
任何人都知道如何做到这一点? 所有的帮助将非常感激。
nodemon不会在Windows Docker环境中重新启动
我怎样才能在C#中使用GetNextwindow()?
链接到HTML中的UNC /本地资源
Python调用命令行上指示的脚本是否有path?
为什么我在Windows 10 UWP上收到“软件包无法注册”的部署错误?
有没有办法访问在Windows下gettext使用的语言环境?
我如何“降级”python2.7
如何设置PATH同时使用Java和Python
我最终找到了一个方法来做到这一点,所以我要回答自己的问题,所以也许有人在未来有同样的问题可能会发现它有用。
这是WinApiFunctions的类:
public class WinAPIFunctions { //Used to get Handle for Foreground Window [DllImport("user32.dll",CharSet = CharSet.Auto)] private static extern IntPtr GetForegroundWindow(); //Used to get ID of any Window [DllImport("user32.dll",CharSet = CharSet.Auto)] private static extern int GetwindowThreadProcessId(IntPtr hWnd,out int lpdwProcessId); public delegate bool WindowEnumProc(IntPtr hwnd,IntPtr lparam); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnumChildWindows(IntPtr hwnd,WindowEnumProc callback,IntPtr lParam); public static int GetwindowProcessId(IntPtr hwnd) { int pid; GetwindowThreadProcessId(hwnd,out pid); return pid; } public static IntPtr GetforegroundWindow() { return GetForegroundWindow(); } }
这是我用来测试它是否可行的课程。 我用它在一个简单的控制台程序,只是写出当前焦点的进程的名称:
class FindHostedProcess { public Timer MyTimer { get; set; } private Process _realProcess; public FindHostedProcess() { MyTimer = new Timer(TimerCallback,null,1000); Console.ReadKey(); } private void TimerCallback(object state) { var foregroundProcess = Process.GetProcessById(WinAPIFunctions.GetwindowProcessId(WinAPIFunctions.GetforegroundWindow())); if (foregroundProcess.ProcessName == "ApplicationFrameHost") { foregroundProcess = GetRealProcess(foregroundProcess); } Console.WriteLine(foregroundProcess.ProcessName); } private Process GetRealProcess(Process foregroundProcess) { WinAPIFunctions.EnumChildWindows(foregroundProcess.MainWindowHandle,ChildWindowCallback,IntPtr.Zero); return _realProcess; } private bool ChildWindowCallback(IntPtr hwnd,IntPtr lparam) { var process = Process.GetProcessById(WinAPIFunctions.GetwindowProcessId(hwnd)); if (process.ProcessName != "ApplicationFrameHost") { _realProcess = process; } return true; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。