本帖最后由 浪迹红客 于 2011-11-9 23:01 编辑
最近用Autoit V3写了一个窗口扩大程序,起初在笔记本上Win7系统下编写,很成功,扩大伸缩没有问题
殊不知,将它在Win XP下运行却是白屏一个,汗,控制放大区域坐标移动,有时会变成黑屏
赫赫,心都凉了 ,用api getlasterror$er=DllCall("kernel32.dll", "int", "GetLastError")
FileWrite("t.txt",$er[0]&@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[0], "int", $bitmode)
;MsgBox(0,"",@error)
If Not @error Then
DllCall("gdi32.dll", "int", "StretchBlt", "int", $MyHDC[0], "int", 0, "int", 0, "int", @DesktopWidth, "int", @DesktopHeight, "int", $DeskHDC[0], "int", $2, "int", $3, "int", $4, "int", $5, "long", $SRCCOPY)
EndIf
DllCall("user32.dll", "int", "ReleaseDC", "int", $DeskHDC[0], "hwnd", 0)
DllCall("user32.dll", "int", "ReleaseDC", "int", $MyHDC[0], "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 ;==>minormax
ini文件:[Windows Text] //将扩大窗口标题,若标题栏没有标题,可用SPY++或其他获取
Default=Working
[Control Xcoord] //将扩大窗口区域的X坐标,其相对于主窗口左上角,可用SPY++或其他获取
Default=143
[Control Ycoord] //将扩大窗口区域的Y坐标,其相对于主窗口左上角,可用SPY++或其他获取
Default=48
[Control Width] //将扩大窗口区域的宽度,可用SPY++或其他获取,其单位为像素
Default=650
[Control Height] //将扩大窗口区域的高度,可用SPY++或其他获取,其单位为像素
Default=478
[Bit Mode] //ENGLISH MAGNIFY窗口中位图拉伸模式,默认为4(可增大扩大时的清晰度)
Default=4
[Run Mode] //ENGLISH MAGNIFY有两种运行模式,0:直接接窗口(或客户区)扩大,但效果不理想;1:取区域后间接扩大
Default=1
[0 Mde] //O模式下确定窗口是否被刷新,TRUE:窗口接收一个WM_PAINT消息;FALSE:不发生任何刷新动作
Default=TRUE
|