![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |