Войти

Показать полную графическую версию : [решено] Узнать запущена ли игра на компьютере ...


FlatX007
25-05-2009, 00:49
Как мне с помощью AutoIt узнать запущена ли на компьютере (2D, 3D) игра ? (я подозреваю нужно обратиться к библиотеке DX9-10...)

Пасибо за внимание .

Yashied
25-05-2009, 01:00
Как это сделать по "человечески" я не знаю, но вот тебе функция, которую я написал только что. Она возвращает 1, если приложение запущено в полноэкранном режиме (не максимизированно), в противном случае - 0. Только что проверил на F.E.A.R. 2 и S.T.A.L.K.E.R. Clear Sky в разных разрешениях. Работает.

:tongue:

Func _IsFullScreen()

Local $hWnd = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')

$hWnd = $hWnd[0]

If (@error) Or ($hWnd = 0) Then
Return SetError(1, 0, -1)
EndIf

If (StringInStr(WinGetClassList($hWnd), 'SHELLDLL_DefView') = 0) And (BitAND(WinGetState($hWnd), 2) = 2) And (_WinAPI_GetClientWidth($hWnd) = @DesktopWidth) And (_WinAPI_GetClientHeight($hWnd) = @DesktopHeight) Then
Return 1
EndIf
Return 0
EndFunc ;==>_IsFullScreen

Немножко поправил.

FlatX007
25-05-2009, 01:27
Огооо :o вот это я понимаю ПО человечески - работает!!! +1
Решение по виду простое но WinAPI я незнаю совсем :(

Pozia
25-05-2009, 19:46
Yashied, а можно еще как нибудь сделать чтобы скрипт все время висел в памяти, отслеживал и когда запускается игра принудительно выключал ее?

Yashied
26-05-2009, 11:05
Yashied, а можно еще как нибудь сделать чтобы скрипт все время висел в памяти, отслеживал и когда запускается игра принудительно выключал ее? »
Я думаю, что в этом случае проще в цикле отслеживать появление определенного процесса и при появлении такового предпринять какие-либо действия. Моя функция не определяет наличие запущенной игры, а просто проверяет в полноэкранном или нет режиме работает текущее приложение. Это так же относится и к Windows Media Player, запущенном в полноэкранном режиме (хотя не проверял).

Pozia
26-05-2009, 18:14
Yashied, не. хотелось бы рубить все полноэкранные процессы. Можно в принципе задать список исключений. Можете такое реализовать? Сам профан в этом деле.

FlatX007
27-05-2009, 02:21
Так чтоль ?

#include <WinAPI.au3>

$DiRT = "DiRT.exe" ; Если запущена игра DIRT - то отрубаем её.

While 1
If _IsFullScreen() = 1 Then
Sleep(3000)
If ProcessExists($DiRT) Then ProcessClose($DiRT)
EndIf
WEnd

Func _IsFullScreen()

Local $hWnd = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
$hWnd = $hWnd[0]

If (@error) Or ($hWnd = 0) Then
Return SetError(1, 0, -1)
EndIf

If (StringInStr(WinGetClassList($hWnd), 'SHELLDLL_DefView') = 0) And (BitAND(WinGetState($hWnd), 2) = 2) And (_WinAPI_GetClientWidth($hWnd) = @DesktopWidth) And (_WinAPI_GetClientHeight($hWnd) = @DesktopHeight) Then
Return 1
EndIf
Return 0
EndFunc

Yashied
27-05-2009, 11:38
Так чтоль ? »
Да, FlatX007 прав, но только здесь совершенно нет необходимости использовать _IsFullScreen(). Вообще, я бы не рекомендовал таким радикальным способом закрывать игру (довольно сложное приложение). Что, если в этот момент происходит запись на диск или в реестр. Может быть лучше просто заблокировать основные клавиши, присущее данной игре или мышь. Можно попробывать WinClose(), правда я не уверен, что это сработает. Я думаю, лучший способ для блокировки игры - изменить права доступа в самой Windows.

Pozia
27-05-2009, 19:46
FlatX007, так как у вас не интересно. По чем я знаю какие юзер решит игры поставить? Лучше чтобы скрипт все рубил, за исключением заданных мною прог

FlatX007
28-05-2009, 19:11
А, что обратные исключения трудно задать ? ... темже самым способом. Я ради примера ...

Pozia
28-05-2009, 19:27
FlatX007, я ноль в этом. если не трудно сделайте как я прошу. Спасибо

FlatX007
28-05-2009, 19:53
Особо строго несудите ...автоитом занимаюсь недавно мож чего незнаю сделал как умел ... если что лишнее модератор поправьте ;)

У меня работает проверял!
А простите исправил - сделал бесконечный цикл без паузы у меня в акурат скрипт проц загрузил на 50% :)

;~ #NoTrayIcon

If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

#include <WinAPI.au3>

; СПИСОК ИГР ИСКЛЮЧЕНИЙ. Точное название "окна" игры списываем значение из диспечера задачь вкладка - приложения
Dim $My_Title[3]
$My_Title[0] = "Left 4 Dead"
$My_Title[1] = "FlatOut 2"
$My_Title[2] = "DiRT"
;~ $My_Title[3] = "моя игра 1"
;~ $My_Title[4] = "моя игра 2"

While 1
Sleep(1000)
If _IsFullScreen() = 1 Then
Sleep(3000)

$WinList = WinList("")
For $iWin = 0 To $WinList[0][0]
If _IsFullScreen() = 1 Then
If WinActive($WinList[$iWin][0]) Then
Select
Case $My_Title[0] = $WinList[$iWin][0]
ContinueLoop

Case $My_Title[1] = $WinList[$iWin][0]
ContinueLoop

Case $My_Title[2] = $WinList[$iWin][0]
ContinueLoop

;~ Case $My_Title[3] = $WinList[$iWin][0]
;~ ContinueLoop

;~ Case $My_Title[4] = $WinList[$iWin][0]
;~ ContinueLoop

Case 0 = 0
If _IsFullScreen() = 1 Then
WinKill($WinList[$iWin][0])
; Сообщение для примера :)
MsgBox(48,"Ого!","Запуск этой игры запрёщён злым админюгой это компа!",10)
EndIf
EndSelect
EndIf
EndIf
Next
EndIf
WEnd

Func _IsFullScreen()

Local $hWnd = DllCall('user32.dll', 'hwnd', 'GetForegroundWindow')
$hWnd = $hWnd[0]

If (@error) Or ($hWnd = 0) Then
Return SetError(1, 0, -1)
EndIf

If (StringInStr(WinGetClassList($hWnd), 'SHELLDLL_DefView') = 0) And (BitAND(WinGetState($hWnd), 2) = 2) And (_WinAPI_GetClientWidth($hWnd) = @DesktopWidth) And (_WinAPI_GetClientHeight($hWnd) = @DesktopHeight) Then
Return 1
EndIf
Return 0
EndFunc

Pozia
02-06-2009, 17:56
FlatX007, чудненько. А можете прикрутить список исключений полноэкранных прог? Пусть все же LA и тому подобные плеера работают )

Pozia
08-06-2009, 01:39
FlatX007, вы бы лучше новым сообщением писали. И благодарность бы получили и народ бы в курсе был того что вы поправили. А то я сюда сейчас чисто случайно зашел. Спасибо. Буду тестить.

FlatX007, проверил сейчас на предмет исключения плеера LA. Не работает, так как его название в диспетчере имеет вид: название фильма - Light Alloy. Следовательно при разных фильмах скрипт не верно обрабатывает исключение. Можно ли сделать так чтобы скрипт не конкретно цеплялся за имя программы в диспетчере, а допустим если есть хоть часть из названия программы из диспетчера в спсике исключений то он уже не закрывал процесс? Или как то еще?




© OSzone.net 2001-2012