|
楼主 |
发表于 2010-8-18 10:52:25
|
显示全部楼层
回复 2# newuser
二.进阶部分
1.GUI操作示例讲解
例:读取控件输入框内容并显示
#include <guiconstants.au3>
Opt("GUIOnEventMode",1)
GUICreate("我的第一个窗口")
GUISetOnEvent($GUI_EVENT_CLOSE,"_Exit")
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"_ReadInput")
GUISetState(@SW_SHOW)
While 1
Sleep(1000)
WEnd
Func _Exit()
Exit
EndFunc
Func _ReadInput()
$Message=GUICtrlRead($Input)
MsgBox(0,"","读取的输入框的信息是:"&$Message)
EndFunc
例:读取输入框内容并随机显示窗口背景颜色
#include <guiconstants.au3>
;Global Const $GUI_EVENT_CLOSE=-3 ;窗口关闭消息的值
Opt("GUIOnEventMode",1) ;从默认的消息模式更改为事件模式
GUICreate("创建我的第一个窗口")
GUISetOnEvent($GUI_EVENT_CLOSE,"main") ;点击窗口的关闭后函数main进行处理
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"main") ;点击按钮后函数main负责响应处理
GUISetState(@SW_SHOW)
While 1
GUISetBkColor(RandomColor())
Sleep(3000)
WEnd
Func main()
Switch @GUI_CtrlId ;根据宏@GUI_CtrlId来判断消息
Case $GUI_EVENT_CLOSE
Exit
Case $Btn
$D=GUICtrlRead($Input)
MsgBox(0,"输入框的数据是",$D)
EndSwitch
EndFunc
Func RandomColor()
Return "0x"&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)
EndFunc ;产生一个随机的RGB颜色值
; Hex(表达式[,长度])
; Random([最小值[,最大值[,标志]]]) 标志为1表示返回整数,默认返回浮点数
例:读取输入框内容并随机显示窗口背景颜色
本例重点理解:对已知Windows消息代码的拦截
同时注意学习GUIRegisterMsg()和WinSetTrans()函数的学习
注释:对自己编写的脚本代码中的窗口可以容易的进行窗口消息的拦截,但对于外部程序的窗口进行消息拦截就必须注入到对方的进程中去
;#include <guiconstants.au3>
Global Const $GUI_EVENT_CLOSE=-3 ;窗口关闭消息的值
Global Const $WM_ENTERSIZEMOVE=0X0231 ;窗口移动消息的值
Global Const $WM_EXITSIZEMOVE=0X0232 ;窗口结束移动消息的值
Opt("GUIOnEventMode",1) ;从默认的消息模式更改为事件模式
$Gui=GUICreate("创建我的第一个窗口")
GUISetOnEvent($GUI_EVENT_CLOSE,"main") ;点击窗口的关闭后函数main进行处理
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"main") ;点击按钮后函数main负责响应处理
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_ENTERSIZEMOVE,"WM_ENTERSIZEMOVE") ;当有窗口移动消息产生时,用自定义的函数WM_ENTERSIZEMOVE来响应处理
;GUIRegisterMsg(msgID,自定义函数) 该函数是为“已知的Windows消息代码注册一个用户自定义函数”,我理解是“用户自定义一个函数
;来响应窗口GUI所产生的已知的Windows消息代码,比如窗口移动、关闭或对控件各种点击动作等
GUIRegisterMsg($WM_EXITSIZEMOVE,"WM_EXITSIZEMOVE") ;当有结束窗口移动消息产生时,用自定义的函数WM_EXITSIZEMOVE来响应处理
While 1
GUISetBkColor(RandomColor())
Sleep(3000)
WEnd
Func main()
Switch @GUI_CtrlId ;根据宏@GUI_CtrlId来判断消息
Case $GUI_EVENT_CLOSE
Exit
Case $Btn
$D=GUICtrlRead($Input)
MsgBox(0,"输入框的数据是",$D)
EndSwitch
EndFunc
Func RandomColor()
Return "0x"&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)
EndFunc ;产生一个随机的RGB颜色值
; Hex(表达式[,长度])
; Random([最小值[,最大值[,标志]]]) 标志为1表示返回整数,默认返回浮点数
Func WM_ENTERSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
WinSetTrans($Gui,"",130) ;设置指定窗口的透明度 WinSetTrans("窗口标题","窗口文本",透明度)
EndFunc ;窗口移动时,设置窗口透明值为130
Func WM_EXITSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
WinSetTrans($Gui,"",255)
EndFunc ;窗口结束移动时,设置窗口透明值为255,也就是不透明
例:父窗口与子窗口的学习
此处要加强(控件)标识和(控件)句柄的理解
;#include <guiconstants.au3>
Global Const $GUI_EVENT_CLOSE=-3 ;窗口关闭消息的值
Dim $Child_Gui ;定义一个变量存储子窗口的句柄
Opt("GUIOnEventMode",1) ;从默认的消息模式更改为事件模式
$Gui=GUICreate("创建我的第一个窗口") ;该窗口是 === 父窗口
GUISetOnEvent($GUI_EVENT_CLOSE,"main") ;点击窗口的关闭后函数main进行处理
$Input=GUICtrlCreateInput("1111",10,35,300,20)
$Btn=GUICtrlCreateButton("读取输入框",40,75,90,20)
GUICtrlSetOnEvent($Btn,"main") ;点击按钮后函数main负责响应处理
$Show_Child_Btn=GUICtrlCreateButton("显示子窗口",40,100,90,20) ;点击该按钮显示 --- 子窗口
GUICtrlSetOnEvent($Show_Child_Btn,"main")
GUISetState(@SW_SHOW)
While 1
GUISetBkColor(RandomColor()) ;GUISetBkColor ( 背景色 [, 窗口句柄] )
Sleep(3000)
WEnd
Func main()
Switch @GUI_CtrlId ;根据宏@GUI_CtrlId标识来判断消息
Case $GUI_EVENT_CLOSE
Switch @GUI_WinHandle ;根据宏@GUI_WinHandle来判断产生关闭消息的窗口信息
Case $Gui ;如果当前窗口句柄是$Gui,退出脚本
Exit
Case $Child_Gui ;如果当前窗口句柄是子窗口$Child_Gui,删除子窗口
GUIDelete($Child_Gui)
EndSwitch
Case $Btn
$D=GUICtrlRead($Input)
MsgBox(0,"输入框的数据是",$D)
Case $Show_Child_Btn
Child_Gui()
EndSwitch
EndFunc
Func Child_Gui()
$Child_Gui=GUICreate("",200,40,-1,-1,-1,-1,$Gui) ;GUICreate()里的最后一个参数$Gui表示新建立的窗口是该变量所存储的窗口句柄的子窗口
GUISetOnEvent($GUI_EVENT_CLOSE,"main")
GUISetState(@SW_SHOW)
EndFunc
Func RandomColor()
Return "0x"&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)&Hex(Random(0,255,1),2)
EndFunc ;产生一个随机的RGB颜色值
; Hex(表达式[,长度])
; Random([最小值[,最大值[,标志]]]) 标志为1表示返回整数,默认返回浮点数
Func WM_ENTERSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
WinSetTrans($Gui,"",130) ;设置指定窗口的透明度 WinSetTrans("窗口标题","窗口文本",透明度)
EndFunc ;窗口移动时,设置窗口透明值为130
Func WM_EXITSIZEMOVE($hWndGUI,$MsgID,$WParam,$LParam)
WinSetTrans($Gui,"",255)
EndFunc ;窗口结束移动时,设置窗口透明值为255,也就是不透明
例:父窗口与子窗口的学习(注意:子窗口无法移出到父窗口以外)
Run("notepad.exe")
WinWaitActive("无标题 - 记事本")
$Gui=GUICreate("创建的窗口被嵌入到记事本",240,120)
GUISetState()
DllCall("user32.dll","int","SetParent","hwnd",$Gui,"hwnd",WinGetHandle("无标题 - 记事本"))
Do
Until GUIGetMsg()=-3 Or Not WinExists("无标题 - 记事本") ;当窗口消息等于退出消息或记事本窗口不存在时,就退出DO循环
例1:
#include <guiconstants.au3> ;包含了所有与GUI有关系的常量,比如$Gui_Event_Close
#NoTrayIcon ;隐藏脚本运行时在任务栏tray显示的图标icon
Global $SS_CENTER
Opt('GuiOnEventMode',1) ;从循环消息模式更改到事件模式
GUICreate("Ai Smart Homes - Saint Louis,Missouri",400,300) ;创建主窗口
GUISetIcon("sysleak.ico") ;创建窗口图标,就是在窗口标题前显示的哪个图标
GUISetOnEvent($GUI_EVENT_CLOSE,'GUIExit') ;点击窗口右上角的叉时,调用函数GuiExit()
GUICtrlCreatePic("080402070.jpg",120,5,156,160) ;在GUI上创建图片控件
GUICtrlCreateLabel("Please Choose an Option Below:",98,180,300,15) ;在GUI上创建静态标记控件,$SS_CENTER表示该控件的样式
GUICtrlSetColor(-1,0Xff0000) ;设置控件颜色,-1表示为当前控件
GUICtrlCreateButton("Visit Our Website",100,210,200,30) ;在GUI上创建按钮控件
GUICtrlSetOnEvent(-1,'website') ;为指定的控件点击行为定义用户函数
GUICtrlCreateButton("Send an Email",100,250,200,30)
GUICtrlSetOnEvent(-1,'email')
GUISetState(@SW_SHOW) ;显示当前窗口
Func website()
GUISetState(@SW_HIDE) ;隐藏当前窗口
Run("c:\program files\internet explorer\iexplore.exe 10.64.240.131")
EndFunc
Func email()
GUISetState(@SW_HIDE)
Run("mailto:zougk@petrochina.com.cn")
Exit
EndFunc
While 1
Sleep(500)
WEnd
Func GUIExit()
Exit
EndFunc
例2:所有控件应用
#include <guiconstants.au3>
Global $ACS_AUTOPLAY
GUICreate("GUI Control Examples",500,420)
GUISetIcon(@WindowsDir & "\explorer.exe",0)
$FileMenu=GUICtrlCreateMenu("File")
GUICtrlCreateMenuItem("Example File Menu Item",$FileMenu)
$ContextMenu=GUICtrlCreateContextMenu()
GUICtrlCreateMenuItem("Example1",$ContextMenu)
GUICtrlCreateMenuItem("",$ContextMenu)
GUICtrlCreateMenuItem("Example2",$ContextMenu)
GUICtrlCreateTab(0,0,500,400)
GUICtrlCreateTabItem("AVI,Button,Checkbox,ComboBox")
GUICtrlCreateAvi(@WindowsDir & "\CLOCK.avi",-1,10,30,321,321,$ACS_AUTOPLAY)
GUICtrlCreateLabel("AVI Example",140,355,60,15)
GUICtrlCreateButton("Button Example",350,30,120,30)
GUICtrlCreateCheckbox("Checkbox Example",350,70,120,30)
GUICtrlCreateCombo("ComboBox Example",350,110,120,30)
GUICtrlCreateTabItem("Group,Date,Dummy,Edit,Icon,Input,List,ListView")
GUICtrlCreateGroup("Group Example",20,40,460,60)
GUICtrlCreateDate("",30,60,200,25)
$DummyButton=GUICtrlCreateButton("Dummy Example",270,60,200,25)
$Dummy=GUICtrlCreateDummy()
GUICtrlCreateGroup("",-99,-99,1,1)
GUICtrlCreateEdit("Edit Example",30,120,440,60)
GUICtrlCreateIcon(@WindowsDir & "\cursors\drum,ani",-1,30,200,32,32)
GUICtrlCreateLabel("Icon Example",70,210,80,20)
GUICtrlCreateInput("Input Example",160,205,300,20)
GUICtrlCreateList("List Example",30,240,440,80)
$ListView=GUICtrlCreateListView("List View Example",30,330,440,60)
GUICtrlCreateListViewItem("List View Item Example",$ListView)
GUICtrlCreateTabItem("ActiveX Object")
GUICtrlCreateLabel("ActiveX Object Example",10,30,140,20)
$IE=ObjCreate("Shell.Explorer.2")
$GUIActiveX=GUICtrlCreateObj($IE,10,50,480,340)
$IE.navigate("http://www.aismarthomes.com")
GUICtrlCreateTabItem("Picture,Progress,Radio,Slider,TreeView,Updown")
GUICtrlCreatePic(@WindowsDir & "\blue lace 16.bmp",10,30,40,40)
GUICtrlCreateLabel("Picture Example",55,45,80,20)
GUICtrlCreateLabel("Process Example",400,70,90,20)
$Progress=GUICtrlCreateProgress(10,90,480,25)
GUICtrlSetData($Progress,33)
GUICtrlCreateRadio("Radio Example",10,140,90,20)
GUICtrlCreateLabel("Slider Example",290,170,100,20)
GUICtrlCreateSlider(180,130,280,30)
GUICtrlCreateLabel("Tree View Example",10,200,120,20)
$TreeView=GUICtrlCreateTreeView(10,220,480,60)
$TreeTopLevel=GUICtrlCreateTreeViewItem("Tree View Example",$TreeView)
GUICtrlCreateTreeViewItem("Subitem1",$TreeTopLevel)
GUICtrlCreateTreeViewItem("Subitem2",$TreeTopLevel)
GUICtrlCreateLabel("Example Updown",10,300,100,20)
$UpDownInput=GUICtrlCreateInput("0",10,320,480,60)
GUICtrlCreateUpdown($UpDownInput)
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)
While 1
$GuiMsg=GUIGetMsg()
Select
Case $GuiMsg=$DummyButton
GUICtrlSendToDummy($Dummy)
Case $GuiMsg=$Dummy
MsgBox(0,"Dummy Example","You have clicked the dummy button.")
Case $GuiMsg=$GUI_EVENT_CLOSE
Exit
EndSelect
WEnd
例3:读取控件内容并运行指定程序
#include <guiconstants.au3>
GUICreate("Combo Example",200,80)
GUISetIcon(@WindowsDir & "\explorer.exe",0) ;设置窗口标题的图标
$ComboBox=GUICtrlCreateCombo("Notepad",10,10,120,20)
GUICtrlSetData(-1,"Paint|Commad Prompt")
$Button=GUICtrlCreateButton("Go",10,40,60,20)
GUISetState(@SW_SHOW)
While 1
$GuiMsg=GUIGetMsg()
Select
Case $GuiMsg=$Button
MsgBox(0,"","You Choose is: " & GUICtrlRead($ComboBox) & ".")
Select
Case GUICtrlRead($ComboBox)="Notepad"
Run("notepad.exe")
Exit
Case GUICtrlRead($ComboBox)="Paint"
Run("mspaint.exe")
Exit
Case GUICtrlRead($ComboBox)="Command Prompt"
Run("cmd.exe")
Exit
EndSelect
Case $GuiMsg=$GUI_EVENT_CLOSE
Exit
EndSelect
Wend2. AU3中的DLL应用
语法: DllCall("dll","return type","function"[,"type1",param1[,"typen",param n[])
dll :就是函数function()所对应或存在于的那个Dll file,例1中我要用DllCall()代替Sleep(),而sleep()存在于 kerner32.dll中。
Retrun type :返回类型,sleep()没有返回值,所以应该是”none”
function :函数,例1就是sleep。
type : 参数类型,MSDN规定是DWORD,在AU3中简化为dword。
例1:使用DLLCALL()代替sleep()延迟1秒
MsgBox(0,"","i",2) ;2秒后显示的i消失
;Sleep(1000)
DllCall("kernel32.dll","none","Sleep","dword",1000) ;延迟1秒
MsgBox(0,"","love",2)
DllCall("kernel32.dll","none","Sleep","dword",1000)
MsgBox(0,"","you",2)
DllCall("kernel32.dll","none","Sleep","dword",1000)
例2:使用DllCall()实现MessageBoxW()函数功能
DllCall("user32.dll","int","MessageBoxW","hwnd",0,"wstr","Hello from Dll tutoorial!","wstr","info","uint",0)
;MessageBox()函数存在于user32.dll中
;返回类型为int
;因为显示的字符串信息,常用的字符编码方式是ANSI(美国的工业化标准)和Unicod(统一字符标准)
;所以需要在其function名称后加A或W,常用Unicode,所以MessageBox写成MessageBoxW
;hwnd是窗口句柄类型,因为没有窗口,所以是0
;第1个wstr表示消息窗口所显示的信息,如果将wstr改写成str就显示乱码了,这可能就是字符编码的问题了!
;第2个wstr表示消息窗口的标题
;uint表示消息窗口的显示风格
按ASCII码显示(wstr可改成str了):
DllCall("user32.dll","int","MessageBoxA","hwnd",0,"str","Hello from Dll tutoorial!","str","info","uint",0)
例3:使用Dllcall()实现GetDiskFreeSpace()函数功能
问题:这里参数的类型为什么是 dword* 而不是 dword?如果拿掉 * 显示结果为 0 显然是错的!
;Variable to pass as referecne 变量作为参考来传递
Local $SectorsPerCluster ;每个簇的扇区数
Local $BytesPerSector ;每个扇区的字节数
Local $NumberOfFreeClusters ;自由簇的数量
Local $TotalNumberOfClusters ;总的簇数
$calldata=DllCall("Kernel32.dll","int","GetDiskFreeSpaceW","wstr","D:\","dword*",$SectorsPerCluster,"dword*",$BytesPerSector,"dword*",$NumberOfFreeClusters,"dword*",$TotalNumberOfClusters)
;获取D盘相关以上信息
;The data is returned as an array,even the changed values of the variables
$SectorsPerCluster=$calldata[2]
$BytesPerSector=$calldata[3]
$NumberOfFreeClusters=$calldata[4]
$TotalNumberOfClusters=$calldata[5]
MsgBox(0,"","Total number of clusters:" & $TotalNumberOfClusters)
在windows的 所有DLLS中和有关AU3的DLLS的调用协议或惯例calling conventions(我还不懂它):
一种是:
;With stdcall 所有windows dlls使用the stdcall calling conventions
DllCall(“SomeDll”,”int”,”Func”)
另一种是:
;With cdecl
DllCall(“SomeDll.dll”,”int:cdecl”,”Func”)
例4:用DllCall()实现GetSystemTime()
问题:获得的时间是上午时间?
解:&DllStructGetData($SYSTEMTIME,"wHour")+8,注意多了 +8 (感谢C.L)
ushort :无符号的16位整数
Word: 无符号的16位整数
int: 32位整数
Ptr: 常规指针(void *)
$SYSTEMTIME=DllStructCreate("ushort wYear;ushort wMonth;ushort wDayOfWeek;ushort wDay;ushort wHour;ushort wMinute;ushort wSecond;ushort wMilliseconds")
DllCall("Kernel32.dll","none","GetSystemTime","ptr",DllStructGetPtr($SYSTEMTIME))
MsgBox(0,"现在的时间是:",DllStructGetData($SYSTEMTIME,"wYear")&":"&DllStructGetData($SYSTEMTIME,"wMonth") _
&":"&DllStructGetData($SYSTEMTIME,"wDay")&" "&DllStructGetData($SYSTEMTIME,"wHour")&":"&DllStructGetData($SYSTEMTIME,"wMinute"))该例应用了DllStructCreate()来创建Dll的结构,所谓DllStruct可以理解为“数据的压缩包,包里所有变量在内存中互相挨着”,
补充一例子:显示系统图标与索引
; *******************************************************
; 示例 3 - 显示系统更改图标窗口
; *******************************************************
$sFileName = @SystemDir & '\shell32.dll'
; 创建一个数据结构储存图标索引
$stIcon = DllStructCreate("int")
$stString = DLLStructCreate("wchar[260]")
$structsize = DllStructGetSize($stString)/2
DllStructSetData($stString, 1, $sFileName)
; 运行更改图标窗口 - '62' 是这个函数的顺序值
DllCall("shell32.dll", "none", 62, "hwnd", 0, "ptr", DllStructGetPtr($stString), "int", $structsize, "ptr", DllStructGetPtr($stIcon))
$sFileName = DllStructGetData($stString, 1)
$nIconIndex = DllStructGetData($stIcon, 1)
; 显示文件名和图标索引
Msgbox(0, "信息", "最后选择的文件: " & $sFileName & @LF & "图标索引: " & $nIconIndex
AutoIt基础实践练习笔记一
1.列出本机驱动器个数并分别显示出来?
代码如下:
$drivetotal=DriveGetDrive("all")
If Not @error Then
MsgBox(0,"所有驱动器类型", "总共有" & $drivetotal[0] & "个驱动器")
For $x=1 To $drivetotal[0]
MsgBox(0,"第" & $x & "个驱动器是:",$drivetotal[$x])
Next
EndIf
注意:应进行if错误判断
2.创建一个新文件,并逐行写入内容?
代码如下:
$accordlinewrite=FileOpen("c:\zgktest.txt",1)
If @error Then
MsgBox(0,"error","文件未打开或创建新文件失败")
Else
FileWrite($accordlinewrite,"往第1行写的内容")
FileWrite($accordlinewrite,"继续往第1行写内容" & @CRLF)
FileWrite($accordlinewrite,"往第2行写入的内容")
EndIf
FileClose($accordlinewrite)
注意:fileopen()并不是通常的“打开文件”,而是AutoIt3后台打开并进行操作
3.逐行读去文件内容?
代码如下:
HotKeySet("{F2}","_Copy")
;定义F2为热键,按下F2后,执行函数“ _Copy "
Global $LineNum=1
Global $IniFile=FileOpenDialog("选择要读取的文本文件","","(*)")
If @Error Then Exit
;"选择要读取的文本文件"是"打开文件窗口的标题"
;" "是你指定"打开文件的路径",空默认为"系统根目录下"
;(*)是"打开的文件类型"
While 1
Sleep(500)
WEnd
;不清楚,等待什么呢?我把它拿掉也没影响什么?不过我也是刚学AU3不到1个月,还没摸到门呢?
Func _Copy()
$GetLine=FileReadLine($IniFile,$LineNum)
If @Error=-1 Then
$LineNum=1
Else
ClipPut($GetLine)
Send("^{V}")
$LineNum+=1
EndIf
EndFunc
;if @Error=-1 如果到文件末尾,在返回文件首行
;ClipPut($GetLine) 将读取到的内容放到剪贴板上,在 Send("^{V}") 进行粘贴,再 $LineNum+=1 进入下一行
4.播放AVI文件?
#include <GUIConstants.au3>
$x=ObjCreate("WMPlayer.OCX")
$Form1 = GUICreate("AForm1", 500,400, 193, 200)
$Button1 = GUICtrlCreateButton("开始", 104, 344, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 272, 336, 121, 41, 0)
$sky=GUICtrlCreateObj($x, 100,50,500,500)
GUISetState(@SW_SHOW)
$x.uimode="none"
$x.url="F:\家庭录象\yiyan\liuyi107.avi"
$x.Controls.play
;MsgBox(0,"",$sky)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
Wend
5.自动建立文本文件并保存?
代码如下:
Send("#r")
;#表示Windows徽标,即发送Win+R
WinWaitActive("运行")
Send("notepad.exe{Enter}")
;发送notepad.exe到运行窗口并回车
WinWaitActive("无标题 - 记事本")
Send("这里是通过WIN+R打开运行窗口,再自动输入notepad.exe后,在打开记事本程序自动输入指定内容后保存并退出 {F5}")
;Send("现在的时间/日期是 {F5}")
WinClose("无标题 - 记事本")
WinWaitActive("记事本")
Send("!Y")
WinWaitActive("另存为")
Send("testautosave.txt!S")
;将新建立的文本文件命名为testautosave.txt并存储
遗留问题(已解决-感谢C.L):无法存储到指定路径?
Send("#r")
WinWaitActive("运行","打开(&O)")
ControlSetText("运行","打开(&O)","Edit1","notepad.exe")
ControlClick("运行","打开(&O)","Button2")
WinWaitActive("无标题 - 记事本")
Send("用于测试对于ComboBox的操作,其中还包括测试controlcommand下的setcurrentselection selectstring")
WinClose("无标题 - 记事本")
;Send("!F")
;Send("!X")
WinWaitActive("记事本","文件 无标题 的文字已经改变。")
ControlClick("记事本","文件 无标题 的文字已经改变。","Button1")
WinWaitActive("另存为","保存在")
;ControlCommand("另存为","保存在","ComboBox1","SelectString","本地磁盘 (C:)")
;ControlCommand("另存为","保存在","ComboBox1","SetCurrentSelection",5)
ControlSetText("另存为","保存在","Edit1","testComboBox.txt")
;其实改成ControlSetText("另存为","保存在","Edit1","c:\testComboBox.txt")就OK了
ControlClick("另存为","保存在","Button2")
新问题:
1. ControlCommand("另存为","保存在","ComboBox1","SelectString","本地磁盘 (C:)")
为什么不好使?(已解决-感谢afan)
是" 本地磁盘 (C:)"前的图标没有捕获造成的吗?可能是“该图标造成字符串不匹配最终造成ControlCommand()失效!
在该语句前/后分别加上:ControlClick("另存为","保存在","ComboBox1")就确保ControlCommand()成功
我的理解:因为她特殊,controlclick()先让它获得焦点,在利用controlcommand()下的selectstring命令选中希望的存储路径,再controlclick()返回到到ComboBox上,这样理解容易些!
2. ControlCommand("另存为","保存在","ComboBox1","SetCurrentSelection",5)
为什么不好使?
它不涉及图标的问题啊!
方法补充一(条条大路同罗马):
$newfilename="c:\zgknew.txt"
$newfilecontents="C盘下新建立一个文件zgknew.txt,写入内容后自动保存"
$temp=FileOpen($newfilename,2)
FileWrite($temp,$newfilecontents)
FileClose($temp)
6.求某正数的立方?
代码如下:
Dim $x,$y
While 1
$x=InputBox("inputbox","请输入一个正整数:","","",50,50,"","",10)
$y=$x^3
Select
Case @error=0
MsgBox(0,"inputbox 成功",$x & "的3次方是:" & $y)
Case @error=1
MsgBox(0,"canel","你按了取消按钮")
ExitLoop
Case @error=2
MsgBox(0,"delay","时间超时")
ExitLoop
EndSelect
Wend
注意:当使用inputbox()输入时,一定要验证“当按下Cancel按钮时的动作”
7.对输入的学生分数进行评价?
代码如下:
Dim $score
While 1
$score=InputBox("分数输入","请输入每名学生的分数:")
;$score=InputBox("分数输入","请输入每名学生的分数:","","",100,50,150,250,50)
;"default"是InputBox内默认的值
;If @error=1 Then MsgBox(0,"取消","你按了取消按钮")
If @error=1 Or $score="" Then
MsgBox(0,"发生错误","你按了取消按钮或输入值为空")
Exit
EndIf
If @error=2 Then MsgBox(0,"超时了","在规定时间内你没有输入学生分数")
Select
Case $score>90 And $score<=100
MsgBox(0,"优秀类","该名学生成绩优秀")
Case $score>80 And $score<=90
MsgBox(0,"良好类","该名学生成绩良好")
Case $score>=60 And $score<=80
MsgBox(0,"优秀","该名学生成绩及格")
Case $score>=0 And $score<60
MsgBox(0,"优秀","该名学生成绩很差")
Case Else
MsgBox(0,"输入错误","输入了不正确的分数")
EndSelect
Wend
我的错误:把If @error=1 Or $score="" 中的红色部分写成了@error=””,这样无论输入什么样的分数都先执行 MsgBox(0,"发生错误","你按了取消按钮或输入值为空") 再进行case判断。
8.
;目的:随意输入4位以内的整数,判断它是多少位,每一位数分别是什么,并把它们反向排列成一个新数
;技巧:把十位 百位 千位 都当 个位 来处理
Dim $Unit=0,$Ten=0,$Hundred=0,$Thousand=0
Dim $Digit=1
Dim $Num,$NewNum
$Num=InputBox("输入框","请输入4为数以内的整数")
If @error=1 Or $Num="" Then
MsgBox(0,"发生错误","按了Cancel按钮或输入值为空")
Exit
EndIf
Select
Case $Num>=0 And $Num<10
$Digit=1
$Unit=Mod($Num,10)
$NewNum=$Unit
Case $Num>=10 And $Num<100
$Digit=2
$Unit=Mod($Num,10)
$Ten=Mod(($Num-$Unit)/10,10)
$NewNum=$Ten+$Unit*10
Case $Num>=100 And $Num<1000
$Digit=3
$Unit=Mod($Num,10)
$Ten=Mod(($Num-$Unit)/10,10)
$Hundred=Mod(($Num-$Ten*10-$Unit)/100,10)
$NewNum=$Hundred+$Ten*10+$Unit*100
Case $Num>=1000 And $Num<=9999
$Digit=4
$Unit=Mod($Num,10)
$Ten=Mod(($Num-$Unit)/10,10)
$Hundred=Mod(($Num-$Ten*10-$Unit)/100,10)
$Thousand=Mod(($Num-$Hundred*100-$Ten*10-$Unit)/1000,10)
$NewNum=$Thousand+$Hundred*10+$Ten*100+$Unit*1000
EndSelect
MsgBox(0,"digit","这是一个"&$Digit&"位数"&@CRLF _
&"个位:"&$Unit&@CRLF&"十位:"&$Ten&@CRLF&"百位:"&$Hundred&@CRLF _
&"千位:"&$Thousand&@CRLF&"重组的新数:"&$NewNum)
9.突然想用AutoIt3自动MSTSC?
代码如下:
Run("mstsc")
WinWaitActive("远程桌面连接","连接(&N)")
ControlSetText("远程桌面连接","连接(&N)","Edit1","要登陆的IP")
ControlClick("远程桌面连接","连接(&N)","Button1")
WinWaitActive("要登陆的IP - 远程桌面")
;注意上面的窗口标题我改了
Send("password{Enter}")
补充(感谢cnhfg):
send(("+{tab}"))
send("administrator")
send("{tab}")
send("123")
send("{enter}")
10.输出一个3行5列矩阵?
代码如下:
Dim $i,$j
;分别定义了对 行 和 列 操作的2个变量
Dim $s=""
;定义了用于输出目的的变量
For $i=1 To 3
For $j=1 To 5
$s=$s&" " & ($i*10+$j)
Next
$s=$s & @CRLF
Next
MsgBox(0,"从第1到第3逐行输出:",$s)
;错误:$s=$s&" " & ($i*10+$j)
;首先输出的数字是连着的,原因是将 " "写成了""
;其次是将($i*10+$j)写成了"$i*10+$j
11.要求只能用20张10元、20元、50元的人民币组成总额为600元,问总共有多少组法?
代码如下:
Dim $Ten,$Twenty,$Fifty
;分别定义 10 20 50 人民币的张数 变量
Dim $Sum=""
;定义了成功组合的结果 变量
For $ten=0 To 20
For $Twenty=0 To 20
For $Fifty=0 To 12
If $Ten+$Twenty+$Fifty=20 And $Ten*10+$Twenty*20+$Fifty*50=600 Then
$Sum=$Sum&"10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF
EndIf
Next
Next
Next
;因为限定了只能用20张人民币
;而可能使用的10元人民币张数在0-60之间;可能使用的20元人民币张数在0-30之间;可能使用的50元人民币张数在0-12之间;
;以上2个条件必须同时符合,所以10元在0-20之间;20元在0-20之间;50元在0-12之间才行
MsgBox(0,"显示组合结果",$Sum)
;我的错误 $Sum="10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF
;少了$Sum=$Sum&"10元人民币是:"&$Ten&"张 "&"20元人民币的是:"&$Twenty&"张 "&"50元人民币是:"&$Fifty&"张 "&@CRLF,这是个致命错误,没有使用初始状态的$Sum,当然只能显示最后一次成功组合的信息,照猫画猫是不行的啊!!!
12.关于ASCII的了解?
ASCII列表就是“字符串与ASCII值一一对应的关系表”。
ASC(字符串) :将字符串转换成对应的ASCII值
Chr(ASCII值) :将ASCII值转换成字符串
@CR 对应13 ;@LF 对应10 ;@TAB 对应 9
A-Z 分别对应65-90 ;a-z 分别对应 97-122
具体示例代码1:
Dim $i,$s
$s=""
For $i=65 To 90
$s=$s&Chr($i)&" "
Next
MsgBox(0,"依次显示ASCII值从65-90所对应的字符串值",$s)
具体示例代码2:
Dim $Char
While 1
$Char=InputBox("判定输入是否是字母","请输入字符")
If @error=1 Or $Char="" Then
MsgBox(0,"输入非法","你输入的不是字符或输入为空")
Exit
EndIf
If (Asc($Char)>=65 And Asc($Char)<=90) Or (Asc($Char)>=97 And Asc($Char)<=122) Then
MsgBox(0,"输入正确","你输入的是A-Z或a-z中的字母"&"中的 "&$Char)
Else
MsgBox(0,"输入错误","你输入的不是A-Z或a-z中的字母")
Exit
EndIf
Wend
13.乘法口诀?
方法1:
Dim $i,$j
Dim $s=""
For $i=1 To 9
For $j=1 To 9
$s&=StringFormat ("%2d *%2d=%-2d",$i,$j,$i*$j)&" "
Next
$s=$s&@CRLF
Next
;$s = StringReplace ($s,"=0","= ") 修改了StringFormat(),该行可以省略掉了
MsgBox(0,"乘法口诀列式",$s)
;感谢C.L
;StringFormat("格式控制字符串",变量1[,...变量32])
;返回根据“格式控制字符串”参数定义中的“变量格式”格式化后的字符串
;好绕嘴,就是根据“格式控制字符串定义的格式进行后续变量的输出
; % 格式控制字符串标识
; 2d 以整数类型输出,2是输出的宽度
; - 在指定的宽度左对齐,默认是右对齐
;我将$s&=StringFormat ("%2d*%2d=%2d",$i,$j,$i*$j)&" " 改成 $s&=StringFormat ("%2d *%2d=%-2d",$i,$j,$i*$j)&" "
;StringReplace("字符串","搜索串"或起始位置,"替换串"[,数量[区分大小写]]
;$text = StringReplace("this is a line of text", " ", "-")
;$numreplacements = @extended
;@extended 扩展函数返回值,常用于StringReplace()
;MsgBox(0, "替换后:", $text)
;MsgBox(0, "替换操作次数:", $numreplacements)
方法2:@TAB 制表符
;感谢lpxx
Dim $i,$j
Dim $s=""
For $i=1 To 9
For $j=1 To 9
$s=$s&$i&"*"&$j&"="&($i*$j)&" "& @TAB
Next
$s=$s&@CRLF
Next
MsgBox(0,"乘法口诀列式",$s)
方法3:设置内循环
;感谢netegg
Dim $i,$j
Dim $s=""
For $i=1 To 9
For $j=1 To $i ;精华所在
$s=$s&$j&"*"&$i&"="&($j*$i)&" "& @TAB
Next
$s=$s&@CRLF
Next
MsgBox(0,"乘法口诀列式",$s) |
|