![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Я очень люблю поиграть в игры, а именно в игру под названием Vindictus. Но при этом мне еще мне нужно регулярно учить язык Java. И что-бы мне легче было читать книгу я на Delphi написал маленькую программку которая мониторит все запущенные процессы в системе и если я наиграл больше 2 часов игры в день но при этом не прочитал час книгу она должна вырубать процесс с игрой. Все вроде было нормально(т.к. всегда сначала читал книгу а потом уже играл), а вчера решил по экспериментировать. И выходит так что процесс игры ни в какую не хочет завершаться.
Что я пробовал: Первая попытка: Получаю PID игры и при помощи Код:
TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, GamePID), 0); Вторая попытка: Получаю хендл окна и пытаюсь по нему закрыть Код:
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) нормально возвращает и завершает. Собственно что посоветовать можете? Последний раз редактировалось m1sclick, 29.04.2012 в 17:26. |
#2
|
|||
|
|||
![]() Для начала - попробовать запустить монитор ои имени Администратора и посмотреть - сработает ли.
|
#3
|
|||
|
|||
![]() Какой монитор?
Вообще как программа моя так и сама игра запускаются от имени администратора. Та и через диспетчер задач нормально закрывается. |