RSS订阅追求最高效、最简单的解决方案
你的位置:首页 » autoit3研究 » 正文

AU3《FAQ 大全》初学者必看

选择字号: 超大 标准 技术小哥 发布于2015年01月11日 属于 autoit3研究 栏目  0个评论 4898人浏览

Q1 如何调试脚本?

MsgBox(0,"测试",$var)
ConsoleWrite("var=" & $var & @CRLF)

Q2 操作CMD相关命令
Q2.1 如何运行DOS命令?

Run(@ComSpec & ' /c dir>d:\dir.txt',"", @SW_HIDE)

#include
$rc = _RunDos("start [url]Http://www.18883.com[/url]")

Q2.2 运行DOS命令如何连接AU3变量?

Local $var="d:\dir.txt"
Run(@ComSpec & ' /c dir>"'&$var&'"',"", @SW_HIDE)

Q2.3 运行DOS命令如何自动应答?(注意:这并不属于AU3的问题,这里附带说一下。)

RunWait(@ComSpec & ' /c echo y|cacls %systemroot%\system32\wpcap.dll /d everyone',

@SystemDir, @SW_HIDE)

Q2.4 多层DOS命令如何用?如netsh,diskpart等。

$dns="192.168.0.1"
RunWait(@ComSpec & ' /C netsh -c interface ip set dns 本地连接 source=static addr="' & $dns

&'" register=PRIMARY ',"", @SW_HIDE )

Q2.5 运行DOS命令如何直接截取回显?

;注意:回显截取只支持Run而不是RunWait
#include
Opt("MustDeclareVars",1)
_test()
Func _test()
Local $foo,$line,$lines
$foo = Run(@ComSpec & " /c sc query Alerter", @SystemDir, @SW_HIDE, $STDOUT_CHILD)
$lines = ""
While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
$lines &= $line
Wend
MsgBox(0,"test",$lines)
EndFunc

Q3 如何防止程序重复运行?

$g_szVersion = "test"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)

#include
_Singleton("test")

Q4 如何直接运行系统程序关联的文件?如[.txt, .msi, .pdf, .jpg, .lnk, .msc]等等!!!

ShellExecute("Notepad.exe")
ShellExecute("test.txt", "", @ScriptDir, "edit")
ShellExecute("http://www.autoit.net.cn")
ShellExecute("C:\boot.ini", "", "", "print")
ShellExecute("test.lnk","",@ScriptDir)
ShellExecute("gpedit.msc", "", "", "open", @SW_MAXIMIZE)
Q5 如何控制系统服务?

API的控制服务
_StartService() 开始服务
_StopService() 停止服务
_ServiceExists() 检测服务
_ServiceRunning() 运行服务
_CreateService() 建立服务
_DeleteService() 删除服务
WMI的控制服务
_ServStart() 开始服务
_ServStop() 停止服务
_ServDelete() 删除服务
_ServGetDetails() 服务详情
_ServGetState() 服务状态
_ServListInstalled() 服务列表
_ServPause() 暂停服务
_ServResume() 服务改名
_SerSetState() 设置服务状态

 

Q6 如何操作注册表?

Q6.1 常用的注册表设置

;读取注册表指定的值
$var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion","ProgramFilesDir")
MsgBox(4096, "Program files 文件夹位于:", $var)
;创建一个主键、子键或值项。
RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Test", "TestKey", "REG_SZ", "Hello this is a test")
;删除注册表指定的值 (注意:这里删除的是键项,而不是键值。)
RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE", "TestKey")
;其他还有RegEnumKey(),RegEnumVal(),详细应用请参考帮助。

Q6.2 注册表权限设置

有的键值是需要先设置权限的。可以通过外部程序setacl.exe设置权限
例子:
$setacl=@TempDir & "\setacl.exe"

RunWait(@ComSpec & ' /c '&$setacl& ' MACHINE\SYSTEM\CurrentControlSet\Enum\Root\ACPI_HAL /registry /grant everyone /full', @TempDir, @SW_HIDE)

[attach=275]

Q7 如何不重启刷新注册表马上生效?

Do
ProcessClose("explorer.exe")
Until Not ProcessExists("explorer.exe")
Run("gpupdate /force","",@SW_HIDE)

;强烈推存应用这个
DllCall("user32.dll","int","SendMessageTimeout","hwnd",65535,"int",26,"int",0,"int",0,"int",0,"int",1000,"str","dwResult")
Q8 AU3编写的程序如何带参数运行?

If $cmdline[0] <> 0 Then
$filename = $cmdline[1]
MsgBox(4096, "测试", '你输入的命令行参数是 "' & $filename & '"')
Else
MsgBox(64, "测试", '请带参数运行此程序')
EndIf

If StringInStr($CmdLineRaw, "/help") Then
MsgBox(64,"帮助","这是本程序的帮助说明")
EndIf

Q9 如何删除脚本程序自身?

;删除脚本程序自身
Run(@ComSpec&' /c ping 127.0.0.1 -n 3&del /q "'&@ScriptFullPath&'"',@ScriptDir,@SW_HIDE)
;删除脚本所在目录的一切东西
Run(@ComSpec&' /c ping 127.0.0.1 -n 3&rd /q/s "'&@ScriptDir&'"',@ScriptDir,@SW_HIDE)
Q10 AU3如何实现加密字符串和文件校验?

;RC4加密(AU3内置函数)
#include
Opt("MustDeclareVars", 1)
Local $var
;加密字符串
$var=_StringEncrypt(1,"sanhen",@ComputerName,1)
MsgBox(0,"test",$var)
;解密字符串
$var=_StringEncrypt(0,$var,@ComputerName,1)
MsgBox(0,"test",$var)

;MD5字符串加密
AU3如何调用MD5加密的问题。
其实官方一早就已经出有了MD5的UDF,只是有的朋友不大善于搜索罢了。
现在提供两个官方MD5的UDF给有需要应用的朋友下载。
一个是C语言格式的,一个是VBscript格式的UDF,其实作用是相同的。
看个人喜好了,下边是应用例子。

#include
#include

$c_md5=md5("sanhen")
$vb_md5=MD5_String("sanhen")

MsgBox(64,"C格式的MD5加密",$c_md5)
MsgBox(64,"Vbscript脚本格式的MD5加密",$vb_md5)

 

;MD5文件效验

#compiler_plugin_funcs = MD5Hash
;上边的这句不能少。不然在Scite中调试出错。直接运行的可以省略上边这句。
$file=@SystemDir & "\userinit.exe"
$plH = PluginOpen("\\server-2\update\tools\MD5Hash.dll")
$md5=MD5Hash($file, 1, True)
If $md5<>"7BD70EC53CB7398246C84D25BFF33AA8" Then
;装的是上海政府原版XP SP2,MD5是上边的那个,不同系统的用附件的DLL读取一下。
FileWriteLine("\\server-2\log$\log.txt",@ComputerName &"号机感染病毒!!!")
EndIf
PluginClose($plH)

;哈唏算法

1.
函数名称:FSHash
作  者:JSThePatriot
更新日期:8-28-2006
函数功用:MD5, SHA-1算法


2.
函数名称:StringHash
作  者:SolidSnake
更新日期:12-12-2006
函数功用:生成MD5,SHA1,SHA256,Tiger以及WhirlPool
验证字符串

3.
函数名称:FileHash
作  者:SolidSnake
更新日期:12-12-2006
函数功用:生成MD5,SHA1,SHA256,Tiger以及WhirlPool
验证文件

4.
函数名称:Blowfish
作  者:piccaso
更新日期:5-3-2007
函数功用:blowfish加/解密函数

Q11 如何修改屏幕分辨率/刷新频率/颜色深度?
保存为: ChangeScreenRes.AU3 (可以任意)

#include-once
;===============================================================================
;
; 函数名称: _ChangeScreenRes()
; 详细信息: 修改 屏幕分辨率,刷新率.
; 版本: 1.0.0.1
; 参数: $i_Width - 屏幕宽度(如1024X768 中的 1024)
; $i_Height - 屏幕高度(如1024X768 中的 768)
; $i_BitsPP -桌面颜色深度(如 32BIT,32位)
; $i_RefreshRate - 屏幕刷新率(如 75 MHZ).
; 需求 AutoIt 测试版 > 3.1 以上
; 返回值 : 成功,屏幕更新,@ERROR = 0
; 失败,屏幕不更新, @ERROR = 1
;===============================================================================
Func _ChangeScreenRes($i_Width = @DesktopWidth, $i_Height = @DesktopHeight, $i_BitsPP = @DesktopDepth, $i_RefreshRate = @DesktopRefresh)
Local Const $DM_PELSWIDTH = 0x00080000
Local Const $DM_PELSHEIGHT = 0x00100000
Local Const $DM_BITSPERPEL = 0x00040000
Local Const $DM_DISPLAYFREQUENCY = 0x00400000
Local Const $CDS_TEST = 0x00000002
Local Const $CDS_UPDATEREGISTRY = 0x00000001
Local Const $DISP_CHANGE_RESTART = 1
Local Const $DISP_CHANGE_SUCCESSFUL = 0
Local Const $HWND_BROADCAST = 0xffff
Local Const $WM_DISPLAYCHANGE = 0x007E
If $i_Width = "" Or $i_Width = -1 Then $i_Width = @DesktopWidth ; default to current setting
If $i_Height = "" Or $i_Height = -1 Then $i_Height = @DesktopHeight ; default to current setting
If $i_BitsPP = "" Or $i_BitsPP = -1 Then $i_BitsPP = @DesktopDepth ; default to current setting
If $i_RefreshRate = "" Or $i_RefreshRate = -1 Then $i_RefreshRate = @DesktopRefresh ; default to current setting
Local $DEVMODE = DllStructCreate("byte[32];int[10];byte[32];int[6]")
Local $B = DllCall("user32.dll", "int", "EnumDisplaySettings", "ptr", 0, "long", 0, "ptr", DllStructGetPtr($DEVMODE))
If @error Then
$B = 0
SetError(1)
Return $B
Else
$B = $B[0]
EndIf
If $B <> 0 Then
DllStructSetData($DEVMODE, 2, BitOR($DM_PELSWIDTH, $DM_PELSHEIGHT, $DM_BITSPERPEL, $DM_DISPLAYFREQUENCY), 5)
DllStructSetData($DEVMODE, 4, $i_Width, 2)
DllStructSetData($DEVMODE, 4, $i_Height, 3)
DllStructSetData($DEVMODE, 4, $i_BitsPP, 1)
DllStructSetData($DEVMODE, 4, $i_RefreshRate, 5)
$B = DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_TEST)
If @error Then
$B = -1
Else
$B = $B[0]
EndIf
Select
Case $B = $DISP_CHANGE_RESTART
$DEVMODE = ""
Return 2
Case $B = $DISP_CHANGE_SUCCESSFUL
DllCall("user32.dll", "int", "ChangeDisplaySettings", "ptr", DllStructGetPtr($DEVMODE), "int", $CDS_UPDATEREGISTRY)
DllCall("user32.dll", "int", "SendMessage", "hwnd", $HWND_BROADCAST, "int", $WM_DISPLAYCHANGE, _
"int", $i_BitsPP, "int", $i_Height * 2 ^ 16 + $i_Width)
$DEVMODE = ""
Return 1
Case Else
$DEVMODE = ""
SetError(1)
Return $B
EndSelect
EndIf
EndFunc ;==>_ChangeScreenRes

例子:
--------------------------------------------------------------------
#include
;设置为800X600 32位色,@75MHZ
_ChangeScreenRes(800,600,32,75)
--------------------------------------------------------------------

这个就挺好用的。
例如:_ChangeScreenRes(1024, 768, 32, 85)
下边我发个锁定刷新率的吧。当然你用软件也可以实现。
以下是用AU3来实现的。锁定了三个分辨率。
$MonitorClass = 'HKLM\SYSTEM\CurrentControlSet\Control\Class\{4D36E96E-E325-11CE-BFC1-08002BE10318}'
$i = 1
While $i > 0
$Ver = RegEnumKey($MonitorClass, $i)
If @error Then ExitLoop
$MODES = $MonitorClass & '\' & $Ver
$DriverDesc = RegRead ( $MODES, "DriverDesc" )
If $DriverDesc <> '' Then
RegWrite ( $MODES & '\MODES\1024,768' , "Mode1", "REG_SZ", '2.0-254.0,85.0-85.0,+,+' )
RegWrite ( $MODES & '\MODES\640,480' , "Mode1", "REG_SZ", '2.0-254.0,85.0-85.0,+,+' )
RegWrite ( $MODES & '\MODES\800,600' , "Mode1", "REG_SZ", '2.0-254.0,85.0-85.0,+,+' )
$i = $i + 1
Else
RegDelete ( $MODES )
EndIf
WEnd

打赏

标签:

1

猜你喜欢

右侧2016一起努力
最新发布的文章
最新评论

公告

十年相伴 值得信赖 需要定制开发、购买加速器可以联系 QQ1368762345,微信同号