Что нового

[Ошибки] Variable used without being declared.

codw

Новичок
Сообщения
19
Репутация
1
При запуске скрипта:

Код:
;coded by UEZ 2012
#include <Array.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>


$aWinlist = GetAllWindow()

For $i = 0 To UBound($aWinlist) - 1
    $hWnd = $aWinlist[$i][1]
    If Not WinActive($hWnd) Then ExitLoop
Next
If $i = UBound($aWinlist) Then Exit MsgBox(0, "Info", "No inactive window found", 10)

_GDIPlus_Startup()
$hBitmap = Capture_Window($hWnd, 300, 200)
_GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & "\Test.jpg")
_GDIPlus_BitmapDispose($hBitmap)
ShellExecute(@ScriptDir & "\Test.jpg")
_GDIPlus_Shutdown()
Exit

Func Capture_Window($hWnd, $w, $h)
    Local $hDC_Capture = _WinAPI_GetWindowDC($hWnd)
    Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC_Capture)
    Local $hHBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Capture, $w, $h)
    Local $hObject = _WinAPI_SelectObject($hMemDC, $hHBitmap)
    DllCall("user32.dll", "int", "PrintWindow", "hwnd", $hWnd, "handle", $hMemDC, "int", 0)
    _WinAPI_DeleteDC($hMemDC)
    Local $hObject = _WinAPI_SelectObject($hMemDC, $hObject)
    _WinAPI_ReleaseDC($hWnd, $hDC_Capture)
    Local $hBmp = _GDIPlus_BitmapCreateFromHBITMAP($hHBitmap)
    _WinAPI_DeleteObject($hHBitmap)
    Return $hBmp
EndFunc   ;==>Capture_Window

Func GetAllWindow() ;code by Authenticity - modified by UEZ
    Local $aWin = WinList(), $aWindows[1][4]
    Local $iStyle, $iEx_Style, $iCounter = 0
    Local $i, $hWnd_state, $aWinPos

    For $i = 1 To $aWin[0][0]
        $iEx_Style = BitAND(_WinAPI_GetWindowLong($aWin[$i][1], $GWL_EXSTYLE), $WS_EX_TOOLWINDOW)
        $iStyle = BitAND(WinGetState($aWin[$i][1]), 2)
        If $iEx_Style <> -1 And Not $iEx_Style And $iStyle Then
            $aWinPos = WinGetPos($aWin[$i][1])
            If $aWinPos[2] > 1 And $aWinPos[3] > 1 Then
                $aWindows[$iCounter][0] = $aWin[$i][0]
                $aWindows[$iCounter][1] = $aWin[$i][1]
                $aWindows[$iCounter][2] = $aWinPos[2]
                $aWindows[$iCounter][3] = $aWinPos[3]
                $iCounter += 1
            EndIf
            ReDim $aWindows[$iCounter + 1][4]
        EndIf
    Next
    ReDim $aWindows[$iCounter][4]
    Return $aWindows
EndFunc   ;==>GetAllWindow


возникает ошибка:

image.png


Насколько я понимаю проблема в переменной $hMemDC, но она же обьявлена тут:
Код:
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC_Capture)

Если после этой строчки добавить MsgBox(0,"",$hMemDC) то вываливается окошко со значением этой переменной (0x......), тем не менее после возникает ошибка

ткните пожалуста где косяк?
 
Автор
C

codw

Новичок
Сообщения
19
Репутация
1
сейчас стоит AutoIt 3.3.10.2 может быть стоит поставить более раннюю версию?
так то скрипты все работают (которые вообще запускал), кроме этого
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
Вот у меня сейчас тоже 3.3.10.2 и тоже ошибка (line 31).
Может в новом AutoIt функции _WinAPI изменились?

UPD: Я разобрался... Надо убрать Local.
Заменяем строку
Код:
Local $hObject = _WinAPI_SelectObject($hMemDC, $hObject)

на строку
Код:
$hObject = _WinAPI_SelectObject($hMemDC, $hObject)

И если Local убрать то этот код будет работать в AutoIt 3.3.10.2 также, как и в версии 3.3.8.1
 

Mur

Осваивающий
Сообщения
132
Репутация
32
Автор
C

codw

Новичок
Сообщения
19
Репутация
1
поставил AutoIt 3.3.8.1 всё заработало
 

InnI

AutoIT Гуру
Сообщения
4,951
Репутация
1,446
codw
В строке 31 уберите "Local" - будет работать и на 3.3.10.2.
 
Верх