浪迹红客 发表于 2011-11-9 22:55:50

stretchblt扩大调用不成功,求助

本帖最后由 浪迹红客 于 2011-11-9 23:01 编辑

最近用Autoit V3写了一个窗口扩大程序,起初在笔记本上Win7系统下编写,很成功,扩大伸缩没有问题
殊不知,将它在Win XP下运行却是白屏一个,汗,控制放大区域坐标移动,有时会变成黑屏
赫赫,心都凉了{:face (229):} ,用api getlasterror$er=DllCall("kernel32.dll", "int", "GetLastError")
FileWrite("t.txt",$er&@CRLF)
获取错误数值,有时显示无效句柄(又或无效DC句柄),所以偶认为是否参数格式不对,或者在传递过程中发生了什么。。。或者用了stretchblt后没使用SetBrushOrgEx函数
来设置刷子的起始点,不过,Win XP下用对准吗?
总之,原因自己找不到,实在木办法,作为一名AU3并且热爱AU3的新手。。。在此恳求论坛的各位大大能够帮偶找出问题。代码:#include <WinAPI.au3>
#include <WinAPIEx.au3>
Global $leave = 0, $2, $3, $4, $5, $orihwnd, $MyhWnd, $02, $03, $04, $05, $state = 0, $Omode
HotKeySet("{Esc}", "leave")
HotKeySet("{space}", "op")
HotKeySet("{up}", "up")
HotKeySet("{down}", "down")
HotKeySet("{right}", "right")
HotKeySet("{left}", "left")
HotKeySet("^{up}", "_up")
HotKeySet("^{down}", "_down")
HotKeySet("^{right}", "_right")
HotKeySet("^{left}", "_left")

FileInstall("info.ini", @ProgramsDir & "\", 1)
If Not FileExists("info.ini") Then
        $rt = MsgBox(20, "错误", "缺少info.ini" & @CRLF & "是否重新创建?")
        If $rt = 6 Then
                FileMove(@ProgramsDir & "\" & "info.ini", @ScriptDir & "\", 1)
        Else
                Exit
        EndIf
EndIf
$1 = IniRead("info.ini", "Windows Text", "Default", "Working")
$2 = IniRead("info.ini", "Control Xcoord", "Default", "200")
$3 = IniRead("info.ini", "Control Ycoord", "Default", "10")
$4 = IniRead("info.ini", "Control Width", "Default", "500")
$5 = IniRead("info.ini", "Control Height", "Default", "500")
$bitmode = IniRead("info.ini", "Bit Mode", "Default", "4")
$runmode = IniRead("info.ini", "Run Mode", "Default", "1")
$Omode = IniRead("info.ini", "0 Mode", "Default", "true")
If Not WinExists($1) Then
        MsgBox(16, "错误", "设置程序未运行!")
        Exit
EndIf
If $runmode = 1 Then
        SplashTextOn("MAGNIFY TOOL", "", @DesktopWidth, @DesktopHeight, 0, 0, 1)
        $MyhWnd = WinGetHandle("MAGNIFY TOOL")
       
EndIf
$orihwnd = WinGetHandle($1)
While Not $leave
        Sleep(25)
        If $runmode = 1 Then MAG()
        If $runmode = 0 Then win()
WEnd

Func MAG()
       
        $MyHDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $MyhWnd)
        If @error Then Return
        $DeskHDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $orihwnd)
        DllCall("gdi32.dll", "int", "SetStretchBltMode", "int", $MyHDC, "int", $bitmode)
        ;MsgBox(0,"",@error)
        If Not @error Then
                DllCall("gdi32.dll", "int", "StretchBlt", "int", $MyHDC, "int", 0, "int", 0, "int", @DesktopWidth, "int", @DesktopHeight, "int", $DeskHDC, "int", $2, "int", $3, "int", $4, "int", $5, "long", $SRCCOPY)
        EndIf
        DllCall("user32.dll", "int", "ReleaseDC", "int", $DeskHDC, "hwnd", 0)
        DllCall("user32.dll", "int", "ReleaseDC", "int", $MyHDC, "hwnd", $MyhWnd)
EndFunc   ;==>MAG

Func win()
        If $Omode = "TRUE" Then $Omode = True
        _WinAPI_MoveWindow($orihwnd, $04, $05, @DesktopWidth + $02, @DesktopHeight + $03, $Omode)
       
EndFunc   ;==>win
Func leave()
        FileDelete(@ProgramsDir & "\" & "info.ini")
       
        $leave = 1
EndFunc   ;==>leave

Func up()
        $5 += 10
       
        $05 -= 10
EndFunc   ;==>up

Func down()
        $5 -= 10

        $05 += 10
EndFunc   ;==>down

Func left()
        $4 += 10

        $04 -= 10
EndFunc   ;==>left

Func right()
        $4 -= 10

        $04 += 10
EndFunc   ;==>right

Func _up()
        $3 += 10

        $03 -= 10
EndFunc   ;==>_up

Func _down()
        $3 -= 10
       
        $03 += 10
EndFunc   ;==>_down

Func _left()
        $2 += 10

        $02 -= 10
EndFunc   ;==>_left

Func _right()
        $2 -= 10
       
        $02 += 10
EndFunc   ;==>_right

Func op()
        If WinExists($MyhWnd) Then
                minormax($MyhWnd)
        Else
                minormax($orihwnd)
        EndIf
EndFunc   ;==>op

Func minormax($hnd)
        If $state = 0 Then
                _WinAPI_CloseWindow($hnd)
                $state = 1
        Else
                _WinAPI_OpenIcon($hnd)
                $state = 0
        EndIf
EndFunc   ;==>minormaxini文件:      //将扩大窗口标题,若标题栏没有标题,可用SPY++或其他获取
Default=Working   
    //将扩大窗口区域的X坐标,其相对于主窗口左上角,可用SPY++或其他获取
Default=143         
    //将扩大窗口区域的Y坐标,其相对于主窗口左上角,可用SPY++或其他获取
Default=48         
   //将扩大窗口区域的宽度,可用SPY++或其他获取,其单位为像素
Default=650         
    //将扩大窗口区域的高度,可用SPY++或其他获取,其单位为像素
Default=478         
          //ENGLISH MAGNIFY窗口中位图拉伸模式,默认为4(可增大扩大时的清晰度)
Default=4         
          //ENGLISH MAGNIFY有两种运行模式,0:直接接窗口(或客户区)扩大,但效果不理想;1:取区域后间接扩大
Default=1         
             //O模式下确定窗口是否被刷新,TRUE:窗口接收一个WM_PAINT消息;FALSE:不发生任何刷新动作
Default=TRUE

浪迹红客 发表于 2011-11-9 22:56:50

自己先顶一下{:face (197):}

浪迹红客 发表于 2011-11-10 19:59:00

帮顶啊。。。
页: [1]
查看完整版本: stretchblt扩大调用不成功,求助