检查进程是否响应

Check if process is responding

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

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);

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

我的 PInvokes 工作正常,我想,不要随时抛出。 OpenProcess 也在工作。

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

我做错了什么?我读到的所有建议都建议我使用这两个函数。

问题是 SendMessageTimeoutIsHungAppWindow 要求您传递 window 句柄,但您传递的是进程句柄。获取应用程序主 window 的句柄,然后传递它。