Windows服务获取进程的状态

jypcgf 2017-03-06 02:26:46

如图,做了个界面无响应的程序,用来测试。然后我用Windows服务获取这个程序的运行状态,如下代码:
Process[] process = Process.GetProcessesByName("ThreadTest");
bool proType = process[0].Responding;
proType应该返回false,但一直返回true,这是什么原因呢?
...全文
400 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
裸奔的蜗牛 2019-09-30
  • 打赏
  • 举报
回复
无响应是因为后天阻塞了, 状态还是响应中
  • 打赏
  • 举报
回复
session 0隔离导致的 先看下Process.Responding的实现

public bool get_Responding()
{
    if (!this.haveResponding)
    {
        IntPtr mainWindowHandle = this.MainWindowHandle;
        if (mainWindowHandle == IntPtr.Zero)
        {
            this.responding = true;
        }
        else
        {
            IntPtr ptr2;
            this.responding = NativeMethods.SendMessageTimeout(new HandleRef(this, mainWindowHandle), 0, IntPtr.Zero, IntPtr.Zero, 2, 0x1388, out ptr2) != IntPtr.Zero;
        }
    }
    return this.responding;
}
你的服务和那个程序不是运行在同一个会话中,而Process.Responding是通过向目标程序发送一个Windows测试消息,5秒内有响应则返回true,但前提是,要能正确取得目标进程主窗口句柄 有一个很简单的办法,挂一个全局钩子,任务桌面应用(有窗口的)启动你都会收到通知,有了这个就好办了,目标程序加载你的钩子模块,只需要双方作一次简单的通讯,比如全名管道,socket,全局事件(这里指内核事件,不是Net中的普通事件),共享内存
Poopaye 2017-03-06
  • 打赏
  • 举报
回复
If the process does not have a MainWindowHandle, this property returns true.

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧