找回密码
 加入
搜索
查看: 2842|回复: 5

找人帮忙分析下桌面图标同步程序代码 最好加上详细注释!

  [复制链接]
发表于 2010-1-21 14:44:12 | 显示全部楼层 |阅读模式
本帖最后由 风雨过后? 于 2010-1-21 14:46 编辑

找人帮忙分析下桌面图标同步程序代码 最好加上详细注释!这代码有提示变量没声明!
#NoTrayIcon
#AutoIt3Wrapper_icon=D:\autoit3\Aut2Exe\Icons\FOLDER.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=2008-04-19, 23:31
#AutoIt3Wrapper_Res_Description=桌面图标同步程序
#AutoIt3Wrapper_Res_Fileversion=1.0.0.1
#AutoIt3Wrapper_Res_LegalCopyright=Amu

#include <GuiListView.au3> 
Opt("MustDeclareVars", 1)
Global $hWndManager = WinGetHandle("Program Manager")
Global $hWndDesktop = ControlGetHandle("Program Manager","",1)
Global $LVS_Style = _WinAPI_GetWindowLong($hWndDesktop, $GWL_STYLE)
Global $inifile, $iSet, $iRefresh, $SNAPTOGRID

If $CmdLine[0] Then
        For $i = 1 To $CmdLine[0]
                Select
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)load[=:].+$|^[/-](?i)l[=:].+$') And Not $inifile                
                                $iSet = 1
                                $inifile = StringRegExpReplace($CmdLine[$i], '^[/-](?i)load[=:]?|^[/-](?i)l[=:]?', "")
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)save[=:].+$|^[/-](?i)s[=:].+$') And Not $inifile
                                $iSet = 0
                                $inifile = StringRegExpReplace($CmdLine[$i], '^[/-](?i)save[=:]?|^[/-](?i)s[=:]?', "")
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)SnapToGrid[=:]\d+$|^[/-](?i)g[=:]\d+$') And $inifile                
                                $SNAPTOGRID = Number (StringRegExpReplace($CmdLine[$i], '^[/-](?i)SnapToGrid[=:]?|^[/-](?i)g[=:]?', "") )
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)Refresh$|^[/-](?i)r$')
                                $iRefresh = 1
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)Help$|^[/-](?i)[?h]$')
                                MsgBox(64,"参数帮助!","AutoIcon.exe [</load|/save>=<file>] [/G=<0|1>] [/R]" & @CRLF & "" & @CRLF & _
                                        "/load=file 要加载的配置文件。" & @CRLF & "/save=file 要保存的配置文件。" & @CRLF & _
                                                "/G=<0|1>   为“0”取消图标对齐到网格,为“1”图标对齐到网格,默认不作更改。" & @CRLF & "/R         相当于桌面右键“刷新”")
                                Exit
                        Case Not $inifile
                                $inifile = $CmdLine[$i]
                                If FileExists($inifile) Then $iSet = 1
                EndSelect        
        Next
Else
        If Not IsDeclared("iMsgBoxAnswer") Then Dim $iMsgBoxAnswer
        $iMsgBoxAnswer = MsgBox(547,"注意!","" & @CRLF & "选“是”保存桌面图标位置信息到文件" & @CRLF & "" & @CRLF & "选“否”从文件读取并排列桌面图标。")
        Select
                Case $iMsgBoxAnswer = 6 ;Yes
                        $inifile = FileSaveDialog( "输入一个文件名。", @ScriptDir, "配置文件(*.ini)", 2)
                        If @error Or Not $inifile Then Exit
                        $iSet = 0
                        If Not StringRegExp($inifile, "\.ini$") Then $inifile &= ".ini"
                Case $iMsgBoxAnswer = 7 ;No
                        $inifile = FileOpenDialog( "选择一个文件。", @ScriptDir, "配置文件(*.ini)", 1)
                        If @error Or Not $inifile Then Exit
                        $iSet = 1
                Case $iMsgBoxAnswer = 2 ;Cancel
                        Exit
        EndSelect        
EndIf

If $iSet Then
        If $SNAPTOGRID Then $SNAPTOGRID = $LVS_EX_SNAPTOGRID
        If IsNumber ($SNAPTOGRID) Then _SendMessage($hWndDesktop, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SNAPTOGRID, $SNAPTOGRID)
        If BitAND($LVS_Style, $LVS_AUTOARRANGE) Then _WinAPI_SetWindowLong($hWndDesktop, $GWL_STYLE, $LVS_Style - $LVS_AUTOARRANGE );取消自动排列
        
        If $iRefresh Then DllCall("shell32.dll", "none", "SHChangeNotify", "long", 0x8000000, "int", 0, "ptr", 0, "ptr", 0);刷新图标
        _SaveAndLoadIconPos($inifile, 1)
        ;Run("RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters")
Else
        _SaveAndLoadIconPos($inifile)
EndIf

Func _SaveAndLoadIconPos($iFile, $iLoad = 0)
        Local $iCount, $iIndex, $sName, $xy        
        If Not IsHWnd($hWndManager) Then $hWndManager = WinGetHandle("Program Manager")
        If Not IsHWnd($hWndDesktop) Then $hWndDesktop = ControlGetHandle("Program Manager","",1)
        $iCount = ControlListView($hWndManager, "", $hWndDesktop, "GetItemCount")
        If @error Then
                SetError(1)
                Return 0
        EndIf
        If Not $iLoad And FileExists($iFile) Then IniDelete($iFile, "图标位置")
        For $iIndex = 0 to $iCount - 1
                $sName = ControlListView($hWndManager, "", $hWndDesktop,"GetText", $iIndex)
                If $iLoad Then
                        $xy = StringSplit (IniRead ($iFile, "图标位置", $sName, ""), ",")
                        If $xy[0] = 2 Then _
                        _SendMessage($hWndDesktop, $LVM_SETITEMPOSITION, $iIndex, BitOR(BitShift($xy[2], -16), BitAND($xy[1], 0xffff) ) ) 
                Else;保存图标信息
                        $xy = _GUICtrlListView_GetItemPosition($hWndDesktop, $iIndex)
                        IniWrite($iFile, "图标位置", $sName, $xy[0] & "," & $xy[1] )
                EndIf        
        Next
        Return 1
EndFunc
发表于 2010-1-21 15:37:46 | 显示全部楼层
我直接用的,没有提示错⑤。。
发表于 2010-1-21 16:30:05 | 显示全部楼层
本帖最后由 非典男人 于 2010-1-21 16:31 编辑

不知何故 我运行的时候提示了  在代码中加入 Global $GWL_STYLE 就可以了
#NoTrayIcon
#include <GuiListView.au3> 
Global $GWL_STYLE
.......
发表于 2010-1-21 16:30:46 | 显示全部楼层
可以一边看代码 一边查帮助文件 基本可以了解个大概了
发表于 2010-1-21 17:28:43 | 显示全部楼层
定义变量就行了.
发表于 2010-1-21 20:05:43 | 显示全部楼层
回复 1# 风雨过后?
#NoTrayIcon
#AutoIt3Wrapper_icon=D:\autoit3\Aut2Exe\Icons\FOLDER.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseAnsi=y
#AutoIt3Wrapper_Res_Comment=2008-04-19, 23:31
#AutoIt3Wrapper_Res_Description=桌面图标同步程序
#AutoIt3Wrapper_Res_Fileversion=1.0.0.1
#AutoIt3Wrapper_Res_LegalCopyright=Amu
;上述在编辑EXE文件时会看到的!!!!

#include <GuiListView.au3> ;调用GuiListView.au3
Opt("MustDeclareVars", 1);创建界面
Global $hWndManager = WinGetHandle("Program Manager") ,$GWL_STYLE ;WinGetHandle ( "窗口标题" [, "窗口文本"] ) $GWL_STYLE 这个由于报错,故在这加载了!
Global $hWndDesktop = ControlGetHandle("Program Manager","",1);ControlGetHandle ( "窗口标题", "窗口文本", 控件ID)
Global $LVS_Style = _WinAPI_GetWindowLong($hWndDesktop, $GWL_STYLE);_WinAPI_GetWindowLong("窗口标题", 检索窗口样式)
Global $inifile, $iSet, $iRefresh, $SNAPTOGRID  ;Global 建立全局变量或常量

If $CmdLine[0] Then ;条件   ---- 变量
        For $i = 1 To $CmdLine[0]  ;开始  TO  结束
                Select  ;以下是多项选项  这里包括case
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)load[=:].+$|^[/-](?i)l[=:].+$') And Not $inifile                
                                $iSet = 1
                                $inifile = StringRegExpReplace($CmdLine[$i], '^[/-](?i)load[=:]?|^[/-](?i)l[=:]?', "")
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)save[=:].+$|^[/-](?i)s[=:].+$') And Not $inifile
                                $iSet = 0
                                $inifile = StringRegExpReplace($CmdLine[$i], '^[/-](?i)save[=:]?|^[/-](?i)s[=:]?', "")
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)SnapToGrid[=:]\d+$|^[/-](?i)g[=:]\d+$') And $inifile                
                                $SNAPTOGRID = Number (StringRegExpReplace($CmdLine[$i], '^[/-](?i)SnapToGrid[=:]?|^[/-](?i)g[=:]?', "") )
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)Refresh$|^[/-](?i)r$')
                                $iRefresh = 1
                                
                        Case StringRegExp($CmdLine[$i], '^[/-](?i)Help$|^[/-](?i)[?h]$')
                                MsgBox(64,"参数帮助!","AutoIcon.exe [</load|/save>=<file>] [/G=<0|1>] [/R]" & @CRLF & "" & @CRLF & _
                                        "/load=file 要加载的配置文件。" & @CRLF & "/save=file 要保存的配置文件。" & @CRLF & _
                                                "/G=<0|1>   为“0”取消图标对齐到网格,为“1”图标对齐到网格,默认不作更改。" & @CRLF & "/R         相当于桌面右键“刷新”")
                                Exit
                        Case Not $inifile
                                $inifile = $CmdLine[$i]
                                If FileExists($inifile) Then $iSet = 1
                EndSelect     ;结束选项   
        Next  ;下一步
Else  ;其它的
        If Not IsDeclared("iMsgBoxAnswer") Then Dim $iMsgBoxAnswer  ;IsDeclared() 检测某个变量是否已声明.   
        $iMsgBoxAnswer = MsgBox(547,"注意!","" & @CRLF & "选“是”保存桌面图标位置信息到文件" & @CRLF & "" & @CRLF & "选“否”从文件读取并排列桌面图标。");这个是信息框
        Select  ;开始进入多项选择
                Case $iMsgBoxAnswer = 6 ;Yes
                        $inifile = FileSaveDialog( "输入一个文件名。", @ScriptDir, "配置文件(*.ini)", 2)
                        If @error Or Not $inifile Then Exit
                        $iSet = 0
                        If Not StringRegExp($inifile, "\.ini$") Then $inifile &= ".ini"
                Case $iMsgBoxAnswer = 7 ;No
                        $inifile = FileOpenDialog( "选择一个文件。", @ScriptDir, "配置文件(*.ini)", 1)
                        If @error Or Not $inifile Then Exit
                        $iSet = 1
                Case $iMsgBoxAnswer = 2 ;Cancel
                        Exit
        EndSelect        ;结束
EndIf

If $iSet Then  ;这个是条件,要想明白是什么回事,得先找到“$iSet”这个是干什么用的!
        If $SNAPTOGRID Then $SNAPTOGRID = $LVS_EX_SNAPTOGRID  ;同上,不过这里多了一个“=” 也就是说明等于号右边的变量同等于左边的条件!
        If IsNumber ($SNAPTOGRID) Then _SendMessage($hWndDesktop, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_SNAPTOGRID, $SNAPTOGRID);IsNumber ( 变量 ) 检测某个变量是否数字类型数据.
              ;_SendMessage  这个函数,我也说不清,有可能用来 调用并 针对 对话框一系列操作的控制吧!
        If BitAND($LVS_Style, $LVS_AUTOARRANGE) Then _WinAPI_SetWindowLong($hWndDesktop, $GWL_STYLE, $LVS_Style - $LVS_AUTOARRANGE );取消自动排列(原文自带的笔注!!!)
        
        If $iRefresh Then DllCall("shell32.dll", "none", "SHChangeNotify", "long", 0x8000000, "int", 0, "ptr", 0, "ptr", 0);刷新图标(原文自带的笔注!!!)
        _SaveAndLoadIconPos($inifile, 1)  ;这个函数也不太明白,可能是用来加载保存图标的位置(或名次)!!!
        ;Run("RunDll32.exe USER32.DLL,UpdatePerUserSystemParameters")
Else
        _SaveAndLoadIconPos($inifile)  ;同上
EndIf

Func _SaveAndLoadIconPos($iFile, $iLoad = 0)   ;Func...Return...EndFunc   声明一个用户自定义函数(user-defined function),并可以放置0个或者多个可选参数,也可以设置返回一个值.
        Local $iCount, $iIndex, $sName, $xy        ;创建 局部用的变量
        If Not IsHWnd($hWndManager) Then $hWndManager = WinGetHandle("Program Manager")  ;这里注意下,常用的是If <表达式> Then 语句 ,而这里多了一个not,依 “and or not "的理解,
                ;不难知道not是什么意思了吧!
        If Not IsHWnd($hWndDesktop) Then $hWndDesktop = ControlGetHandle("Program Manager","",1) ;这里不多说了,给大家留点佘地!
        $iCount = ControlListView($hWndManager, "", $hWndDesktop, "GetItemCount");ControlListView ( "窗口标题", "窗口文本", 控件ID, "命令" [, 选项1 [, 选项2]] )
        If @error Then
                SetError(1);SetError ( 错误码 [, 扩展值 [, 返回值]] )  设置宏 @error 的值.
                Return 0
        EndIf
        If Not $iLoad And FileExists($iFile) Then IniDelete($iFile, "图标位置");FileExists ( "路径" )  检查指定文件或目录是否存在.
                         ;IniDelete ( "文件名", "字段名" [, "关键字"] )   从某标准配置文件(*.ini)中删除某个数值.
        For $iIndex = 0 to $iCount - 1  ;For <变量> = <开始> To <停止> [Step <步进值>]  基于表达式循环.  -1 这里是递减的意思!也就是54321的顺序!
                $sName = ControlListView($hWndManager, "", $hWndDesktop,"GetText", $iIndex) ;上面已解释过!
                If $iLoad Then
                        $xy = StringSplit (IniRead ($iFile, "图标位置", $sName, ""), ",") ;StringSplit ( "字符串", "分隔符" [, 标志 ] ) 以指定分隔符把字符串拆分成若干子串.
                                                ;IniRead ( "文件名", "字段名", "关键字", "默认值" )  从某标准配置文件(*.ini)中读取某个数值.   呵呵,这一句:希望大家多多明白一下什么意思!!达人们喜欢用的!
                        If $xy[0] = 2 Then _
                        _SendMessage($hWndDesktop, $LVM_SETITEMPOSITION, $iIndex, BitOR(BitShift($xy[2], -16), BitAND($xy[1], 0xffff) ) ) ;这个,上面解释过!
                Else;保存图标信息 (原文自带的笔注!!!)
                        $xy = _GUICtrlListView_GetItemPosition($hWndDesktop, $iIndex);#Include <GuiListView.au3>  呵呵,到最后了,加个这个吧!!!只要字母前带下划线的,一般是调用AU3的函数(这是偶的理解)
;_GUICtrlListView_GetItemPosition($hWnd, $iIndex)   搜索目标的位置
                        IniWrite($iFile, "图标位置", $sName, $xy[0] & "," & $xy[1] ) ;IniWrite ( "文件名", "字段名", "键名", "值" ) 写入一个值到标准格式的 .ini 文件.
                EndIf        
        Next
        Return 1
EndFunc
呵呵,一开始只说了部分的理解,后来还是全部说明吧!!!里面有英文的,没有找到汉化的,有解释之误   之处,希望纠正哦!!!

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
afan + 20 + 2

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-29 01:17 , Processed in 0.076156 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表