检查进程是否响应

时间:2018-11-27 16:16:52

标签: c# process pinvoke

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

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秒响应一次,而不响应。任务管理器无法正常响应,但我的应用程序无法响应。

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

1 个答案:

答案 0 :(得分:2)

问题是SendMessageTimeoutIsHungAppWindow要求您传递窗口句柄,但您正在传递进程句柄。获取应用程序主窗口的句柄,然后将其传递。