Проверьте, отвечает ли процесс - PullRequest
0 голосов
/ 27 ноября 2018

Я создаю приложение, которое должно проверить реакцию какого-либо процесса.

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 голосов
/ 27 ноября 2018

Проблема в том, что SendMessageTimeout и IsHungAppWindow требуют, чтобы вы передавали дескрипторы окна, но вы передаете дескрипторы процесса.Получите дескриптор главного окна приложения и передайте его вместо этого.

...