Автор Тема: Определить игровой режим  (Прочитано 601 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн mekez [?]

  • Новичок
  • *
  • Сообщений: 11
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Всем привет, возможно ли через AutoIt определить при запуске приложений, игра это или просто программа? Т.е. определять игровой режим)
PS Всякие игровые центры как-то сканируют комп и находят же установленные на них игры, и отслеживают запуск
PPS Как вариант из мыслей - определять полноэкранное разворачивание приложения любого... Но сюда попадает скринсейвер тоже... И проигрыватель )
« Последнее редактирование: Май 17, 2017, 04:33:44 от mekez »

Русское сообщество AutoIt

Определить игровой режим
« Отправлен: Май 17, 2017, 02:25:49 »

Оффлайн scanfail [?]

  • Новичок
  • *
  • Сообщений: 244
  • Репутация: 17
    • Награды
Re: Определить игровой режим
« Ответ #1, Отправлен: Май 18, 2017, 13:06:47 »
Всем привет, возможно ли через AutoIt определить при запуске приложений, игра это или просто программа? Т.е. определять игровой режим)
PS Всякие игровые центры как-то сканируют комп и находят же установленные на них игры, и отслеживают запуск
PPS Как вариант из мыслей - определять полноэкранное разворачивание приложения любого... Но сюда попадает скринсейвер тоже... И проигрыватель )
Можешь просто создать базу, то бишь добавить в скрипт, либо текстовой файл имена окон/процессов игр, всякие "Dark Souls 2"/"darksouls2.exe" и т.д., а потом в скрипте уже делать проверку на существование этого окна/процесса.
Вот простенький скрипт:
Код: AutoIt [Выделить]
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
 


Оффлайн mekez [?]

  • Новичок
  • *
  • Сообщений: 11

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Определить игровой режим
« Ответ #2, Отправлен: Май 18, 2017, 20:26:29 »
Нет, с перечислением игр вообще не вариант, их же тысячи))
Пока что набросал так:
Код: AutoIt [Выделить]
#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 то
-игровой режим
Или
-не игровой
конец

воот, направьте на правильный путь, пожалуйста))
« Последнее редактирование: Май 18, 2017, 20:35:46 от mekez »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3989
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Определить игровой режим
« Ответ #3, Отправлен: Май 19, 2017, 08:28:29 »
mekez
Код: AutoIt [Выделить]
#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\[email protected]: %s\[email protected]: %s", $tRET, @error ,@extended))
   EndIf
EndFunc ;==> _GameMode


Скорблю и помню.




Русское сообщество AutoIt

Re: Определить игровой режим
« Ответ #3 Отправлен: Май 19, 2017, 08:28:29 »

Оффлайн scanfail [?]

  • Новичок
  • *
  • Сообщений: 244
  • Репутация: 17
    • Награды
Re: Определить игровой режим
« Ответ #4, Отправлен: Май 19, 2017, 09:22:58 »
Рискну предложить и свой, малость иной вариант.

Код: AutoIt [Выделить]
$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

« Последнее редактирование: Май 19, 2017, 18:58:51 от scanfail »

Оффлайн mekez [?]

  • Новичок
  • *
  • Сообщений: 11

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Определить игровой режим
« Ответ #5, Отправлен: Май 19, 2017, 14:35:09 »
mekez
Код: AutoIt [Выделить]
#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\[email protected]: %s\[email protected]: %s", $tRET, @error ,@extended))
   EndIf
EndFunc ;==> _GameMode

Спасибо, но не совсем то( Например активный рабочий стол определяется, как игровой режим, проигрыватель на полный экран также. Я хочу в исключения добавить рабочий стол и список проигрывателей. Определять их окна решил по классу. Посмотри пожалуйста предыдущий мой пост, я там уже накидал часть кода и описал как вижу эту реализацию, но не знаю, как это правильно доделать до конца (

PS scanfail, спасибо, интересное решение, но если интернет выключен не подходит)
« Последнее редактирование: Май 19, 2017, 14:43:00 от mekez »

Помечен как лучший ответ пользователем mekez Отправлен Май 19, 2017, 17:26:50

Онлайн InnI [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 3576
  • Репутация: 945
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Определить игровой режим
« Ответ #6, Отправлен: Май 19, 2017, 16:21:37 »
mekez
Код: AutoIt [Выделить]
#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


Русское сообщество AutoIt

Re: Определить игровой режим
« Ответ #6 Отправлен: Май 19, 2017, 16:21:37 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
36 Ответов
10223 Просмотров
Последний ответ Февраль 17, 2011, 22:26:51
от `p r o x y
3 Ответов
2916 Просмотров
Последний ответ Апрель 09, 2011, 19:06:23
от firex
4 Ответов
3391 Просмотров
Последний ответ Май 19, 2011, 18:55:54
от general66
6 Ответов
4354 Просмотров
Последний ответ Июнь 21, 2011, 19:36:05
от xmel-sera
2 Ответов
2713 Просмотров
Последний ответ Сентябрь 18, 2011, 17:30:35
от Vovsla
6 Ответов
2604 Просмотров
Последний ответ Январь 19, 2012, 17:10:09
от DarWiM
2 Ответов
878 Просмотров
Последний ответ Март 08, 2015, 21:27:50
от CreatoR
4 Ответов
1597 Просмотров
Последний ответ Сентябрь 07, 2015, 22:36:03
от Skif_off
0 Ответов
4152 Просмотров
Последний ответ Февраль 27, 2016, 15:16:47
от inververs
41 Ответов
4997 Просмотров
Последний ответ Сентябрь 06, 2017, 12:18:03
от VadimKHL