Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Узнать запущена ли игра на компьютере ... (http://forum.oszone.net/showthread.php?t=140967)

FlatX007 25-05-2009 00:49 1126771

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

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

Yashied 25-05-2009 01:00 1126781

Как это сделать по "человечески" я не знаю, но вот тебе функция, которую я написал только что. Она возвращает 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 1126791

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

Pozia 25-05-2009 19:46 1127358

Yashied, а можно еще как нибудь сделать чтобы скрипт все время висел в памяти, отслеживал и когда запускается игра принудительно выключал ее?

Yashied 26-05-2009 11:05 1127797

Цитата:

Цитата Pozia
Yashied, а можно еще как нибудь сделать чтобы скрипт все время висел в памяти, отслеживал и когда запускается игра принудительно выключал ее? »

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

Pozia 26-05-2009 18:14 1128071

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

FlatX007 27-05-2009 02:21 1128422

Так чтоль ?

Код:

#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 1128575

Цитата:

Цитата FlatX007
Так чтоль ? »

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

Pozia 27-05-2009 19:46 1128925

FlatX007, так как у вас не интересно. По чем я знаю какие юзер решит игры поставить? Лучше чтобы скрипт все рубил, за исключением заданных мною прог

FlatX007 28-05-2009 19:11 1129680

А, что обратные исключения трудно задать ? ... темже самым способом. Я ради примера ...

Pozia 28-05-2009 19:27 1129686

FlatX007, я ноль в этом. если не трудно сделайте как я прошу. Спасибо

FlatX007 28-05-2009 19:53 1129709

Особо строго несудите ...автоитом занимаюсь недавно мож чего незнаю сделал как умел ... если что лишнее модератор поправьте ;)

У меня работает проверял!
А простите исправил - сделал бесконечный цикл без паузы у меня в акурат скрипт проц загрузил на 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 1133226

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

Pozia 08-06-2009 01:39 1137899

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

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


Время: 16:41.

Время: 16:41.
© OSzone.net 2001-