首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Win32监视打开的程序

使用Win32监视打开的程序
EN

Stack Overflow用户
提问于 2011-09-23 23:04:28
回答 4查看 5.4K关注 0票数 7

我搜索了网络和各种论坛,但我找不到一件事,那就是如何持续监控打开的程序,然后在被监控的程序发生问题时关闭另一个程序(而不是被监控的程序)。

例如,假设有一个已经打开的记事本窗口,然后用户或某个其他程序打开Windows资源管理器窗口。我想知道如何在不与Windows资源管理器窗口交互的情况下关闭记事本窗口(除了意识到它确实是打开的),以及在用户关闭Windows资源管理器窗口时如何关闭记事本窗口。

提前感谢!:D

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-23 23:08:58

在windows上,您可以使用PSAPI (进程状态API)来了解进程何时启动和终止。EnumProcesses函数可以为您提供此信息。

确定进程终止的一种更可靠的方法(因为进程id可以重用)是等待它的进程句柄(您将需要SYNCHRONIZE访问权限),您可以使用OpenProcess和从EnumProcesses获得的进程id来获得该句柄。

要终止一个进程,总是有TerminateProcess。要调用TerminateProcess,您需要一个具有PROCESS_TERMINATE访问权限的进程句柄。所有这些都假设您拥有在要终止的进程上执行这些操作所需的权限。

票数 8
EN

Stack Overflow用户

发布于 2011-09-24 06:51:29

需要注意的一件事是,进程和程序--或者至少是用户认为的程序--不一定是一回事。

如果您使用PSAPI来获取所有正在运行的进程的列表,您将看到许多与打开的窗口完全不对应的后台进程。还有一些情况下,单个进程可以打开多个顶级窗口。因此,虽然您有记事本这样的简单情况,其中一次notepad.exe进程对应于一个记事本窗口,但您也有这样的情况:

  • word,其中一个word进程处理当前打开的所有word文档(一个进程,多个windows)
  • Explorer,,单个exploere.exe进程处理所有打开的资源管理器窗口,以及控制面板窗口和任务栏等内容。
  • Chrome(和其他浏览器),其中每个选项卡都有自己的进程(多个进程,一个窗口!)

使用TerminateProcess可能不是关闭应用程序的最佳方式:它并不直接等同于单击close按钮。它会立即强制终止整个过程,而不会给它任何清理的机会。如果你在Word上这样做,当它重新启动时,它将进入“恢复模式”,并表现得好像它上次没有完全关闭一样。如果进程已停止响应,最好留下来作为最后的手段。此外,如果您在Word或资源管理器等进程上使用TerminateProcess,您最终将关闭该进程拥有的所有窗口,而不仅仅是一个特定的窗口。

考虑到所有这些,如果你想编写某种类型的程序管理器,你最好采用以窗口为中心的方法,而不是以过程为中心的方法。监视顶级应用程序窗口,而不是监视正在运行的进程。

有几种方法可以侦听windows的更改;使用EVENT_CREATE/DESTROY的SetWinEventHook是侦听正在创建或销毁的HWND的一种方法(您需要在这里进行过滤,因为它会告诉您所有的HWNDs甚至更多!),但您只关心顶层的HWND,而且只关心应用程序的HWND)。在这里(WH_CBT),SetWindowsHookEx可能有其他可行的选择。您还可以使用EnumWindows列出当前显示的窗口(同样,您需要过滤掉所有的对话框和工具提示、当前不可见的HWND等)。

在给定HWND的情况下,如果需要,您可以使用GetWindowThreadProcessId获取进程信息。

要关闭一个窗口,发送WM_SYSCOMMAND/SC_CLOSE是最好的尝试:这更接近于单击关闭按钮,它给了应用程序一个清理的机会。请注意,一些应用程序会显示“您确定要关闭吗?”对话框,如果您最近没有保存-同样,它与用鼠标单击关闭按钮是一致的。

票数 5
EN

Stack Overflow用户

发布于 2011-09-23 23:16:03

在Windows上最广为人知的方法是使用Process Status API。您可以使用此API来enumerate processes,但是,此API很烦人,因为它不能保证您获得完整的列表或进程。

枚举进程的一种更好的方法是使用Tool Help Library,它包括一种在任何给定时间获取完整snapshot of all processes in the system的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7531113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档