我希望从游戏中获得像素颜色并做出反应。 所以我有这个问题:
#include <Color.au3>
Local $pause = False;
$WinName = "Game" ; Let's say there is a game with this name =)
$hwnd = WinGetHandle($WinName) ; Checked handle with powershell and Au3Info, handle is correct
local $res
Opt("PixelCoordMode", 2);
HotKeySet("{F10}", "exitNow");
HotKeySet("{F11}", "Pause");
While 1
;WinWaitActive($hwnd) ; The script stops here if it is uncommented no matter if window is active or not
if ( $pause ) Then
$res = GetPos();
ConsoleWrite ( StringFormat ("Result color: %s %s", $res[0], $res[1] ) )
Sleep (1000)
EndIf
WEnd
Func exitNow()
Exit
EndFunc
Func Pause()
$pause = Not $pause
EndFunc
Func GetPos()
local $var = Hex(PixelGetColor(5, 5, $hwnd)) ; Only works in windowed mode, FullScreen return some random colors like 00FFFFFF or 00AAAAAA
$var = StringTrimLeft($var,2) ; Removing first 2 numbers they r always 00
local $var1 = Hex(PixelGetColor(15, 5, $hwnd)) ; Only works in windowed mode, FullScreen return some random colors like 00FFFFFF or 00AAAAAA
$var1 = StringTrimLeft($var1,2) ; Removing first 2 numbers they r always 00
local $result[2] = [ $var, $var1 ]
return $result
EndFunc
主要脚本应该在窗口激活之前,然后才应该尝试 GetPixelColor 但是从未发生过,无论我做什么,我都尝试过 WindowActivate 仍然没有结果
a) - 我做错了什么?或者可能有另一种方法来检查窗口当前是否处于活动状态?
所以目前我开始禁用脚本,当我手动激活窗口时,按 F11 启用。
b) - PixelGetColor 仅在游戏以窗口模式运行时才有效,如果全屏模式结果无法预测。有没有办法让 PixelGetColor 全屏工作。
我试图以不同的组合运行游戏x32,x64,DX9和DX11全屏结果是错误的。
增加:
现在虽然看起来像这样,但是有效:) 感谢Xenobeologist!
While 1
$hwnd = WinGetHandle('[Active]');
If ( $pause ) Then
If WinGetTitle($hwnd) <> $WinName Then
Pause()
ContinueLoop
EndIf
$res = GetPos();
ConsoleWrite ( StringFormat ("Result color: %s %s", $res[0], $res[1] ) )
Sleep (1000)
Else
If WinGetTitle($hwnd) = $WinName Then
Pause()
ContinueLoop
EndIf
EndIf
WEnd
a)现已解决
b)仍未解决。还有一件事,这个问题的主题并没有说回这个问题,应该在主题中添加信息或者最好开始一个新线程? a)是我的主要问题,解决b)也是完美的,但我可以没有它。据我所知,它要复杂得多。你觉得怎么样?
ADDED2:
据我所知,问题 b)可以通过使用更复杂的代码来解决。这里http://www.autohotkey.com/board/topic/63664-solved-imagesearch-failure-wdirectx-fullscreen-gamewin7/讨论了同样的问题。这是AHK和ImageSearch功能,但我很确定我在全屏幕上得到错误颜色的原因是一样的。我不想让代码太复杂,PrintScreen太慢,所以我会使用窗口模式而不会烦恼 b)。
答案 0 :(得分:2)
这有帮助吗?
#include <MsgBoxConstants.au3>
$handle = WinGetHandle('[Active]')
ConsoleWrite('!Title : ' & WinGetTitle($handle) & @CRLF)
ConsoleWrite('!Process : ' & WinGetProcess($handle) & @CRLF)
ConsoleWrite('!Text : ' & WinGetText($handle) & @CRLF)
Sleep(Random(10, 3000, 1))
If WinActive($handle) Then MsgBox($MB_SYSTEMMODAL, "", "WinActive" & @CRLF & "Scite ")