【问题标题】:Check if process is responding检查进程是否有响应
【发布时间】:2018-11-27 16:16:51
【问题描述】:

我正在创建一个需要检查某个进程的响应的应用程序。

System.Diagnostics.Responding 无法正常工作。所以我正在尝试使用 Windows API 找到解决方案。

我已经尝试过这样的 SendMessageTimeOut:

[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
    IntPtr hWnd, 
    uint msg, 
    UIntPtr wParam, 
    IntPtr lParam, 
    uint flags, 
    uint timeout, 
    out IntPtr pdwResult);


public static bool IsResponding(Process process)
{
    IntPtr hProcess = IntPtr.Zero;

    try
    {
        hProcess = OpenProcess(
            ProcessAccessFlags.QueryInformation | ProcessAccessFlags.DuplicateHandle | ProcessAccessFlags.Synchronize,
            false,
            (uint)process.Id
        );

        if (hProcess == IntPtr.Zero)
            return false;

        IntPtr hResult = SendMessageTimeout(hProcess, 13, UIntPtr.Zero, IntPtr.Zero, SMTO_ABORTIFHUNG, 2000, out IntPtr pdwResult);

        return hResult != IntPtr.Zero;
    }
    catch
    {
        return false;
    }
    finally
    {
        if (hProcess != IntPtr.Zero)
            CloseHandle(hProcess);
    }
}

其他尝试是使用 IsHungAppWindow。

[DllImport("user32.dll", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsHungAppWindow(IntPtr hwnd);

我真的不知道为什么它总是告诉我应用程序没有响应。

我认为,我的 PInvokes 工作正常,不要随时扔。 OpenProcess 也在工作。

我创建了一个 WPF 应用程序,它可以每 15 秒响应一次,也可以不响应一次。任务管理器无法正常响应,但我的应用程序没有。

我做错了什么?我读到的所有关于建议我使用这两个功能的信息。

【问题讨论】:

标签: c# process pinvoke


【解决方案1】:

问题是SendMessageTimeout 和IsHungAppWindow 要求您传递窗口句柄,但您传递的是进程句柄。获取应用程序主窗口的句柄,然后传递它。

【讨论】:

  • 如果我不知道窗口名称和类,如何检索窗口句柄? Process.MainWindowHandle 返回 0。
  • 进程有窗口还是像系统服务一样?
  • 是的,例如,我正在使用 WPF 应用程序进行测试,并且它由服务运行。
  • 您需要按照此处所述枚举窗口:stackoverflow.com/questions/2531828/…
  • 所有这些都是你所关心的不同问题,超出了你所问的范围。
猜你喜欢
  • 2011-03-30
  • 2020-06-20
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 2022-06-21
  • 2021-05-16
相关资源
最近更新 更多