2016-08-09 8 views
0

Я хочу, чтобы контролировать процесс в C++, поэтому я использую:C++ Мониторинг процессов (GetExitCodeProcess)

std::wstring windowName = TEXT("needle"); 
HWND windowHandle = FindWindowW(NULL, windowName.c_str()); 

Функция FindWindow, как я понимаю, проверяет заголовок для всех окон (Почему Microsoft назовите их ОС после основной части, проверяя окна в Windows, безумие). Если название соответствует «игле», то это дает мне ...

HWND windowHandle 

Далее я использую:

DWORD* PID; 
GetWindowThreadProcessId(windowHandle, PID); 
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, *PID); 

Это дает мне ProcessId или PID, как я назвал его. Затем я могу использовать, чтобы ...

HWND p; 
DWORD state; 
GetExitCodeProcess(p, &state); 

... получить состояние процесса, я собираюсь проверить это быть «STILL_ACTIVE», например, так:

 if (state != STILL_ACTIVE) { 
     std::cout << "excessive profanity\n"; 
    } 
    else { 
     std::cout << "sigh of relief\n"; 
    } 

За исключением это не работает, «cout-ing» (новый глагол) значение состояния дает мне какой-то шестнадцатеричный код. Это никогда не «STILL_ACTIVE», несмотря на наличие нескольких окон с «иглой» в качестве названия. Код компилируется отлично, это просто связано с конверсией, указателями, LPCWSTR или чем-то, с чем я никогда не сталкивался. Помощь была бы оценена. Благодаря

+0

Вызов 'GetExitCodeProcess' с' HWND' неправильный, особенно неинициализированный. Вы должны проходить 'hProcess'. И похоже, что вы неправильно проверяете ошибки. Вы также должны заметить, что 'GetExitCodeProcess' не является правильным способом проверить, прошел ли процесс, вы должны использовать' WaitForSingleObject' с нулевым таймаутом. –

ответ

1

У вас есть две проблемы:

1) Как PaulMcKenzie указывает в своем ответе, PID указывает на ничего, и приведет к возникновению проблем. Вместо этого вы должны объявить DWORD и передать указатель на него в GetWindowThreadProcessId:

DWORD PID; 
// note: &PID instead of just PID 
GetWindowThreadProcessId(windowHandle, &PID); 
// note: Just PID instead of *PID 
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); 

2) GetExitCodeProcess необходим дескриптор процесса, а не неинициализированная HWND. Вместо этого вы должны дать ему ручку, возвращенную из OpenProcess:

DWORD state; 
// note: this is the hProcess returned from OpenProcess 
GetExitCodeProcess(hProcess, &state); 

Обратите внимание, что это будет по-прежнему работать только для одного процесса. Если в нескольких процессах есть окна с названием «игла», то результат вашего вызова FindWindow будет непредсказуем.

1

Одна ошибка (и, вероятно, не единственная ошибка), что нет никакого способа это может работать правильно:

DWORD* PID; 
GetWindowThreadProcessId(windowHandle, PID); 

Вы даете GetWindowThreadProcessId неинициализированный указатель, PID. Нет ничего, что функция могла бы сделать с ним, кроме разыменования (вызывающего неопределенное поведение) или, в лучшем случае, проверить, является ли значение NULL.

Когда функция запрашивает указатель, это не означает, что вы буквально объявляете указатель и передаете его функции. Функция хочет адрес существующего объекта:

DWORD PID; 
GetWindowThreadProcessId(windowHandle, &PID); 
+0

Если я сделаю это изменение, вы предложите мне получить ошибку компиляции: '1> main.CPP (189): ошибка C2664: 'HANDLE OpenProcess (DWORD, BOOL, DWORD)': не удается преобразовать аргумент 3 из 'DWORD *' до 'DWord' 1> main.cpp (189): примечание: Там нет контекста в который это преобразование возможно ========== Сложение: 0 удалось, 1 не удалось, 0 уточненный, 0 пропущено ========== '' – Will

+0

станд :: wstring windowName = TEXT («игла»); \t \t HWND WindowHandle = FindWindowW (NULL, windowName.c_str()); \t \t DWORD ПИД; \t \t GetWindowThreadProcessId (WindowHandle, &PID); \t \t HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, ###### и ###### ПИД); \t \t HWND р; \t \t типа DWORD состояния; \t \t GetExitCodeProcess (р, и состояние); 'ошибка выдвигает на первый план ##### & ##### в коде выше – Will

+0

вы уже прошли' & PID' к OpenProcess(), вы должны передать 'PID' –