Я очень люблю поиграть в игры, а именно в игру под названием Vindictus. Но при этом мне еще мне нужно регулярно учить язык Java. И что-бы мне легче было читать книгу я на Delphi написал маленькую программку которая мониторит все запущенные процессы в системе и если я наиграл больше 2 часов игры в день но при этом не прочитал час книгу она должна вырубать процесс с игрой. Все вроде было нормально(т.к. всегда сначала читал книгу а потом уже играл), а вчера решил по экспериментировать. И выходит так что процесс игры ни в какую не хочет завершаться.
Что я пробовал:
Первая попытка: Получаю PID игры и при помощи
Код:
TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, GamePID), 0);
пытаюсь убить процесс. Пытаюсь, но не могу. Проверял через диспетчер задач - PID правильный находит. Читалку книги убивает, а игру никак. Ну да и бог с ним.
Вторая попытка: Получаю хендл окна и пытаюсь по нему закрыть
Код:
h := FindWindow(nil, 'Vindictus EU');
if h <> 0 then
CloseWindow(h);
Но черт побери и так ничего не выходит.
Третья попытка: Нашел в интернете какой-то непонятный код якобы убивающий даже системный процесс
Код:
function TForm2.ProcessTerminate(dwPID:Cardinal):Boolean;
var
hToken:THandle;
SeDebugNameValue:Int64;
tkp:TOKEN_PRIVILEGES;
ReturnLength:Cardinal;
hProcess:THandle;
begin
Result:=false;
// Добавляем привилегию SeDebugPrivilege
// Для начала получаем токен нашего процесса
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, hToken ) then
exit;
// Получаем LUID привилегии
if not LookupPrivilegeValue( nil, 'SeDebugPrivilege', SeDebugNameValue )
then begin
CloseHandle(hToken);
exit;
end;
tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid := SeDebugNameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
// Добавляем привилегию к нашему процессу
AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength);
if GetLastError()<> ERROR_SUCCESS then exit;
// Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
// завершить и системный процесс
// Получаем дескриптор процесса для его завершения
hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, dwPID);
if hProcess =0 then exit;
// Завершаем процесс
if not TerminateProcess(hProcess, DWORD(-1))
then exit;
CloseHandle( hProcess );
// Удаляем привилегию
tkp.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
if GetLastError() <> ERROR_SUCCESS
then exit;
Result:=true;
end;
Но и тут облом вышел.
В общем как я понял из того что показал мне волшебный F7 я не могу получить дескриптор процесса для его завершения. То есть OpenProcess из последней попытки всегда возвращает 0 когда я пытаюсь закрыть игру, а с другими приложениями(STDUViever) нормально возвращает и завершает.
Собственно что посоветовать можете?