2016-06-24 2 views
1

Я пытаюсь определить, жив ли процесс (на данный момент я проверил, я знаю, что он может быть закрыт сразу после проверки), вызвав WaitForSingleObject() с помощью дескриптора get from Process.MainWindowHandle который прекрасно работает с IsIconic() но вернуть WAIT_FAILED и GetLastError()ERROR_INVALID_HANDLEWaitForSingleObject return ERROR_INVALID_HANDLE

UInt32 r = WaitForSingleObject(handle, 0); 
if(r == WAIT_OBJECT_0) 
{ 
    MessageBox.Show("still running!"); 
} 
if(r == WAIT_FAILED) 
{ 
    throw new Win32Exception(Marshal.GetLastWin32Error()); 
} 
+0

Возможный дубликат [Вызов WaitForSingleObject из C#] (http://stackoverflow.com/questions/33718217/calling-waitforsingleobject-from-c-sharp) – MethodMan

+1

Вы не можете ждать по ручке окна. Проверьте документы на странице https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032.aspx для типов ручек, на которые можно ждать. – dxiv

+0

В системе указано, что ваш дескриптор недействителен. Ваш дескриптор недействителен. –

ответ

5

Вы не можете ждать на оконной ручке. Вы можете передавать дескрипторы окон в связанные с окном функции, например IsIconic(), но они не являются объектами ядра, поэтому вы не можете ждать их. The documentation выдает список объектов, которые вы можете ждать на:

Функция WaitForSingleObject может ждать следующих объектов:

  • Изменение уведомления ввода
  • Консоль
  • событий ресурс
  • памяти уведомление
  • Mutex
  • Процесс
  • Семафор
  • Thread
  • Waitable таймер

Итак, если вы хотите ждать на процесс, пока он не закончится, вы можете ждать на ручке процесса, который доступен через Process.Handle Недвижимость.

Но вам вообще не нужно P/вызывать функцию Win32. Класс оболочки .NET Process имеет WaitForExit() и WaitForInputIdle() функции-члены, которые могут использоваться для ожидания процесса (обратите внимание, что оба имеют перегрузки, принимающие значение тайм-аута).

Если это процесс, который вы начали использовать оболочку класса Process, вы можете просто опросить свойство Process.HasExited.

+2

Если у вас есть объект 'Process', разве вы не сможете использовать' HasExited', независимо от того, был ли вы тот, кто фактически породил этот процесс? Я не понимаю, почему это должно волновать, если вызывающий человек также является разработчиком. –

+0

спасибо за ваш ответ, я не хочу ждать, пока он выйдет, тоже не начал процесс. Я хочу проверить, действительно ли определенный процесс все еще жив в определенное время, прежде чем выполнять какое-либо действие (это происходит каждые x секунд). – Jack

+0

@remy. Причина, по которой я писал, что я помню, где-то читал, что это не сработало. Предположительно, класс Process не отслеживает эту информацию, если она не начнет процесс. Глядя на подтверждение моей памяти, я нашел [эту практическую статью] (https://msdn.microsoft.com/en-us/library/y111seb2.aspx), которая гласит: * «Примечание: это значение равно возвращается только для процессов, которые запускаются компонентом Process. "* Это может быть не совсем так; вам нужно будет проверить источник ссылки, чтобы быть абсолютно уверенным. –