我正在创建一个需要检查某些进程响应的应用程序。
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秒响应一次,而不响应。任务管理器无法正常响应,但我的应用程序无法响应。
我做错了什么?我读到的所有关于建议我使用这两个功能的信息。
答案 0 :(得分:2)
问题是SendMessageTimeout
和IsHungAppWindow
要求您传递窗口句柄,但您正在传递进程句柄。获取应用程序主窗口的句柄,然后将其传递。