AutoIT WinWaitActive并不了解窗口是否处于活动状态

时间:2014-12-03 12:23:31

标签: autoit

我希望从游戏中获得像素颜色并做出反应。 所以我有这个问题:

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

1 个答案:

答案 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 ")