Что нового

Определить игровой режим

mekez

Новичок
Сообщения
11
Репутация
0
Всем привет, возможно ли через AutoIt определить при запуске приложений, игра это или просто программа? Т.е. определять игровой режим)
PS Всякие игровые центры как-то сканируют комп и находят же установленные на них игры, и отслеживают запуск
PPS Как вариант из мыслей - определять полноэкранное разворачивание приложения любого... Но сюда попадает скринсейвер тоже... И проигрыватель )
 

scanfail

Знающий
Сообщения
244
Репутация
17
mekez сказал(а):
Всем привет, возможно ли через AutoIt определить при запуске приложений, игра это или просто программа? Т.е. определять игровой режим)
PS Всякие игровые центры как-то сканируют комп и находят же установленные на них игры, и отслеживают запуск
PPS Как вариант из мыслей - определять полноэкранное разворачивание приложения любого... Но сюда попадает скринсейвер тоже... И проигрыватель )
Можешь просто создать базу, то бишь добавить в скрипт, либо текстовой файл имена окон/процессов игр, всякие "Dark Souls 2"/"darksouls2.exe" и т.д., а потом в скрипте уже делать проверку на существование этого окна/процесса.
Вот простенький скрипт:
Код:
Dim $W_GAME[5] = ["Demon's Souls", "Dark Souls", "Dark Souls 2", "Bloodborne", "Dark Souls 3"]

For $i = 0 To UBound($W_GAME) - 1
	If WinExists($W_GAME[$i]) Then
		MsgBox(0, "", "Найдено окно игры " & $W_GAME[$i] & @CRLF & "Игровой режим включен!")
	Else
		MsgBox(0, "", "Окно с игрой " & $W_GAME[$i] & " не найдено" & @CRLF & "Игровой режим выключен!")
	EndIf
Next

Dim $P_GAME[5] = ["demonssouls.exe", "darksouls.exe", "darksouls2.exe", "bloodborne.exe", "darksouls3.exe"]

For $i = 0 To UBound($P_GAME) - 1
	If ProcessExists($P_GAME[$i]) Then
		MsgBox(0, "", "Найден процесс игры " & $P_GAME[$i] & @CRLF & "Игровой режим включен!")
	Else
		MsgBox(0, "", "Процесс с игрой " & $P_GAME[$i] & " не найден" & @CRLF & "Игровой режим выключен!")
	EndIf
Next
 
Автор
M

mekez

Новичок
Сообщения
11
Репутация
0
Нет, с перечислением игр вообще не вариант, их же тысячи))
Пока что набросал так:
Код:
#include <Misc.au3>
#include <WinAPI.au3>

;Список классов окон, на которые не должен срабатывать скрипт
Global $aClass[] = ["Progman", "MediaPlayerClassicW"]

;Определяем разрешение экрана
$DesktopWH = @DesktopWidth&"x"&@DesktopHeight

;Определяем разрешение активного окна
$WindowsSize = WinGetClientSize("[ACTIVE]")
$WindowsSize2 = $WindowsSize[0]&"x"&$WindowsSize[1]

;Определяем класс окна
$WindowsClass = _WinAPI_GetClassName(WinGetHandle('[ACTIVE]'))

While 1 
If $DesktopWH = $WindowsSize2 Then
	msgbox(0,"","Игровой режим")
Else
	msgbox(0,"","Обычный режим")
Endif
WEnd

Но немножко знаний не хватает(( Хочу сделать такое условие:

Если разрешение монитора = разрешению активного окна и если $WindowsClass не из списка $aClass то
-игровой режим
Или
-не игровой
конец

воот, направьте на правильный путь, пожалуйста))
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
mekez
Код:
#include <WinAPIEx.au3>
HotKeySet("^s", "_GameMode") ; CTRL+s
HotKeySet("^x", "_Exit") ; CTRL+x

While 1
   Sleep(250)
WEnd

Func _Exit()
   Exit
EndFunc ;==> _Exit

Func _GameMode()

   $tRET = _WinAPI_GetWindowPlacement(_WinAPI_GetForegroundWindow())
   If @error = 0 Then
	  If (DllStructGetData($tRET, "rcNormalPosition", 4) = @DesktopHeight) And _
		 (DllStructGetData($tRET, "rcNormalPosition", 3) = @DesktopWidth) Then
		 MsgBox(2097152, "Success", "Игровой режим")
	  Else
		 MsgBox(2097152, "Success", "Обычный режим")
	  EndIf
   Else
	  MsgBox(0, "Error", StringFormat("_WinAPI_GetWindowPlacement() failed!\n$tRET: %s\n@error: %s\n@extended: %s", $tRET, @error ,@extended))
   EndIf
EndFunc ;==> _GameMode
 

scanfail

Знающий
Сообщения
244
Репутация
17
Рискну предложить и свой, малость иной вариант.

Код:
$WindowList = WinList()

For $i = 1 To $WindowList[0][0]
	If $WindowList[$i][0] <> "" And BitAND(WinGetState($WindowList[$i][1]), 2) Then
		$Inet = BinaryToString(InetRead("https://www.google.com/search?q=" & _WindowToProcess($WindowList[$i][0])))
		If StringInStr($Inet, "game") Then
			MsgBox(0, "Игровой режим включен", "Процесс " & _WindowToProcess($WindowList[$i][0]) & " является игровым.")
		Else
			MsgBox(0, "Игровой режим отключен", "Процесс " & _WindowToProcess($WindowList[$i][0]) & " не является игровым.")
		EndIf
	EndIf
Next

Func _WindowToProcess($WindowTitle)
    If IsString($WindowTitle) = 0 Then Return -1
    $WindowProcess = WinGetProcess($WindowTitle)
    Return _ProcessName($WindowProcess)
EndFunc

Func _ProcessName($ProcessID)
    If IsString($ProcessID) Then $ProcessID = ProcessExists($ProcessID)
    If Not IsNumber($ProcessID) Then Return -1
    $Process = ProcessList()
    For $p = 1 to $Process[0][0]
        If $Process[$p][1] = $ProcessID Then Return $Process[$p][0]
    Next
    Return -1
EndFunc
 
Автор
M

mekez

Новичок
Сообщения
11
Репутация
0
Garrett сказал(а):
mekez
Код:
#include <WinAPIEx.au3>
HotKeySet("^s", "_GameMode") ; CTRL+s
HotKeySet("^x", "_Exit") ; CTRL+x

While 1
   Sleep(250)
WEnd

Func _Exit()
   Exit
EndFunc ;==> _Exit

Func _GameMode()

   $tRET = _WinAPI_GetWindowPlacement(_WinAPI_GetForegroundWindow())
   If @error = 0 Then
	  If (DllStructGetData($tRET, "rcNormalPosition", 4) = @DesktopHeight) And _
		 (DllStructGetData($tRET, "rcNormalPosition", 3) = @DesktopWidth) Then
		 MsgBox(2097152, "Success", "Игровой режим")
	  Else
		 MsgBox(2097152, "Success", "Обычный режим")
	  EndIf
   Else
	  MsgBox(0, "Error", StringFormat("_WinAPI_GetWindowPlacement() failed!\n$tRET: %s\n@error: %s\n@extended: %s", $tRET, @error ,@extended))
   EndIf
EndFunc ;==> _GameMode
Спасибо, но не совсем то( Например активный рабочий стол определяется, как игровой режим, проигрыватель на полный экран также. Я хочу в исключения добавить рабочий стол и список проигрывателей. Определять их окна решил по классу. Посмотри пожалуйста предыдущий мой пост, я там уже накидал часть кода и описал как вижу эту реализацию, но не знаю, как это правильно доделать до конца (

PS scanfail, спасибо, интересное решение, но если интернет выключен не подходит)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
mekez
Код:
#include <WinAPI.au3>

HotKeySet("^g", "CheckMode")

While Sleep(1111)
WEnd

Func CheckMode()
  ConsoleWrite(IsGameMode() & @CRLF)
EndFunc

Func IsGameMode()
  Local $aClass[] = ["Progman","MediaPlayerClassicW","Photo_Slideshow_FrameWindow","WMPTransition","CWmpControlCntr"]
  Local $hWnd = WinGetHandle(""), $sClass = _WinAPI_GetClassName($hWnd), $aSize = WinGetClientSize($hWnd)
  For $sItem In $aClass
    If $sItem = $sClass Then Return False
  Next
  If Not IsArray($aSize) Then Return SetError(1, 0, -1)
  Return $aSize[0] = @DesktopWidth And $aSize[1] = @DesktopHeight
EndFunc
 
Верх