C# 检测外部进程是否是交互式的,是否有任何可见的UI

C# 检测外部进程是否是交互式的,是否有任何可见的UI,c#,.net,windows,winapi,process,C#,.net,Windows,Winapi,Process,我似乎找不到一种方法来确定流程是否有用户界面,例如用户可以看到的窗口 对于外部进程不有用 在我的测试中似乎总是返回false 我想区分say Notepad和conhost 从进程实例中找出进程ID 使用EnumWindows枚举顶级窗口 调用GetWindowThreadProcessId,查看它是否与目标PID匹配 调用IsWindowVisible和/或IsIconic,测试该窗口是否对用户可见 从进程实例中找出进程ID 使用EnumWindows枚举顶级窗口 调用GetWindowT

我似乎找不到一种方法来确定
流程
是否有用户界面,例如用户可以看到的窗口

  • 对于外部进程不有用
  • 在我的测试中似乎总是返回false
我想区分say Notepad和conhost

  • 进程
    实例中找出进程ID
  • 使用
    EnumWindows
    枚举顶级窗口
  • 调用
    GetWindowThreadProcessId
    ,查看它是否与目标PID匹配
  • 调用
    IsWindowVisible
    和/或
    IsIconic
    ,测试该窗口是否对用户可见
  • 进程
    实例中找出进程ID
  • 使用
    EnumWindows
    枚举顶级窗口
  • 调用
    GetWindowThreadProcessId
    ,查看它是否与目标PID匹配
  • 调用
    IsWindowVisible
    和/或
    IsIconic
    ,测试该窗口是否对用户可见

  • MSDN关于
    System.Diagnostics.Process.MainWindowHandle
    的文章陈述了以下内容

    如果您刚刚启动一个进程并希望使用它的主窗口句柄,请考虑使用WaitForInputIdle方法来允许进程结束,确保主窗口句柄已被创建。否则,将引发异常

    他们的意思是,调用
    主窗口句柄
    ,返回
    IntPtr.Zero
    后,
    窗口
    可能需要几秒钟才能渲染,即使您可以清楚地看到显示的是
    窗口


    请参阅MSDN关于
    System.Diagnostics.Process.MainWindowHandle
    的文章,以获取参考

    如果您刚刚启动一个进程并希望使用它的主窗口句柄,请考虑使用WaitForInputIdle方法来允许进程结束,确保主窗口句柄已被创建。否则,将引发异常

    他们的意思是,调用
    主窗口句柄
    ,返回
    IntPtr.Zero
    后,
    窗口
    可能需要几秒钟才能渲染,即使您可以清楚地看到显示的是
    窗口


    请参阅以供参考

    没有硬性规定可以确定特定流程是否计划在5秒、5分钟、5周内打开其第一个窗口。或者如果它有一些条件逻辑,可能会也可能不会强制进行交互。顺便说一句,conhost可能不是一个好例子,因为它负责显示控制台窗口。因此,它有一个消息循环等等,根据大多数定义,它将是一个GUI程序。没有硬性规定可以确定一个特定的进程是否计划在5秒、5分钟、5周内打开它的第一个窗口。或者如果它有一些条件逻辑,可能会也可能不会强制进行交互。顺便说一句,conhost可能不是一个好例子,因为它负责显示控制台窗口。因此,它有一个消息循环等等,根据大多数定义,它是一个GUI程序。可能无法按预期工作,因为控制台窗口(有时?)的IIRC GetWindowThreadProcessId()返回附加到该控制台的命令行进程。在这种情况下,我假设控制台窗口算作顶级窗口。我不确定如何最好地过滤掉这些。我还没有实际测试过,但希望这些winapi调用能从服务中工作。不,它们没有。请记住,服务在与交互式用户会话不同的会话中运行。会话是隔离的。可能无法按预期工作,因为控制台窗口(有时?)的IIRC GetWindowThreadProcessId()返回附加到该控制台的命令行进程。在这种情况下,我假设控制台窗口算作顶级窗口。我不确定如何最好地过滤掉这些。我还没有实际测试过,但希望这些winapi调用能从服务中工作。不,它们没有。请记住,服务在与交互式用户会话不同的会话中运行。会话是隔离的。在我的例子中,问题是不能直接从服务中使用MainWindowHandle在我的例子中,问题是不能直接从服务中使用MainWindowHandle