检查进程是否响应
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 秒响应一次,也可以不响应一次。任务管理器可以正确无响应,但我的应用程序没有。
我做错了什么?我读到的所有建议都建议我使用这两个函数。
问题是 SendMessageTimeout
和 IsHungAppWindow
要求您传递 window 句柄,但您传递的是进程句柄。获取应用程序主 window 的句柄,然后传递它。
我正在创建一个需要检查某些进程响应的应用程序。
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 秒响应一次,也可以不响应一次。任务管理器可以正确无响应,但我的应用程序没有。
我做错了什么?我读到的所有建议都建议我使用这两个函数。
问题是 SendMessageTimeout
和 IsHungAppWindow
要求您传递 window 句柄,但您传递的是进程句柄。获取应用程序主 window 的句柄,然后传递它。