-
AutoIt
(
http://forum.oszone.net/forumdisplay.php?f=103)
Узнать запущена ли игра на компьютере ...
Как мне с помощью AutoIt узнать запущена ли на компьютере (2D, 3D) игра ? (я подозреваю нужно обратиться к библиотеке DX9-10...)
Пасибо за внимание .
|
Как это сделать по "человечески" я не знаю, но вот тебе функция, которую я написал только что. Она возвращает 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
Немножко поправил.
|
Огооо :o вот это я понимаю ПО человечески - работает!!! +1
Решение по виду простое но WinAPI я незнаю совсем :(
|
Yashied, а можно еще как нибудь сделать чтобы скрипт все время висел в памяти, отслеживал и когда запускается игра принудительно выключал ее?
|
Цитата:
Цитата Pozia
Yashied, а можно еще как нибудь сделать чтобы скрипт все время висел в памяти, отслеживал и когда запускается игра принудительно выключал ее? »
|
Я думаю, что в этом случае проще в цикле отслеживать появление определенного процесса и при появлении такового предпринять какие-либо действия. Моя функция не определяет наличие запущенной игры, а просто проверяет в полноэкранном или нет режиме работает текущее приложение. Это так же относится и к Windows Media Player, запущенном в полноэкранном режиме (хотя не проверял).
|
Yashied, не. хотелось бы рубить все полноэкранные процессы. Можно в принципе задать список исключений. Можете такое реализовать? Сам профан в этом деле.
|
Так чтоль ?
Код:
#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
|
Да, FlatX007 прав, но только здесь совершенно нет необходимости использовать _IsFullScreen(). Вообще, я бы не рекомендовал таким радикальным способом закрывать игру (довольно сложное приложение). Что, если в этот момент происходит запись на диск или в реестр. Может быть лучше просто заблокировать основные клавиши, присущее данной игре или мышь. Можно попробывать WinClose(), правда я не уверен, что это сработает. Я думаю, лучший способ для блокировки игры - изменить права доступа в самой Windows.
|
FlatX007, так как у вас не интересно. По чем я знаю какие юзер решит игры поставить? Лучше чтобы скрипт все рубил, за исключением заданных мною прог
|
А, что обратные исключения трудно задать ? ... темже самым способом. Я ради примера ...
|
FlatX007, я ноль в этом. если не трудно сделайте как я прошу. Спасибо
|
Особо строго несудите ...автоитом занимаюсь недавно мож чего незнаю сделал как умел ... если что лишнее модератор поправьте ;)
У меня работает проверял!
А простите исправил - сделал бесконечный цикл без паузы у меня в акурат скрипт проц загрузил на 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
|
FlatX007, чудненько. А можете прикрутить список исключений полноэкранных прог? Пусть все же LA и тому подобные плеера работают )
|
FlatX007, вы бы лучше новым сообщением писали. И благодарность бы получили и народ бы в курсе был того что вы поправили. А то я сюда сейчас чисто случайно зашел. Спасибо. Буду тестить.
FlatX007, проверил сейчас на предмет исключения плеера LA. Не работает, так как его название в диспетчере имеет вид: название фильма - Light Alloy. Следовательно при разных фильмах скрипт не верно обрабатывает исключение. Можно ли сделать так чтобы скрипт не конкретно цеплялся за имя программы в диспетчере, а допустим если есть хоть часть из названия программы из диспетчера в спсике исключений то он уже не закрывал процесс? Или как то еще?
|
Время: 16:41.
© OSzone.net 2001-