找回密码
 加入
搜索
查看: 6128|回复: 16

[AU3基础] [已解决]自定义MsgBox的位置和按钮文字后添加select执行程序?谢谢chzj589

 火.. [复制链接]
发表于 2017-1-9 09:40:48 | 显示全部楼层 |阅读模式
本帖最后由 令狐大虾 于 2017-1-9 20:39 编辑

看到一个帖子http://www.autoitx.com/forum.php ... mp;highlight=MsgBox里面的第三个
;===============================================================================
;~ 参考: [url]http://www.autoitx.com/forum.php?mod=viewthread&tid=13550&extra=&page=3[/url]
;~ 函数: MsgBoxE()
;~ 描述: 修改 MsgBox() 的位置或按钮文字
;~ 作者:甲壳虫
;~ 参数:
;~ $flag = MsgBox() 的 flag
;~ $title = MsgBox() 标题
;~ $text = MsgBox() 的信息内容
;~ $timeout = MsgBox() 超时
;~ $hwnd = MsgBox() 的 hwnd
;~ $Button1 = 第一个按钮要显示的文字
;~ $Button2 = 第二个按钮要显示的文字
;~ $Button3 = 第三个按钮要显示的文字
;~ $x = MsgBox() 的 x 坐标
;~ $y = MsgBox() 的 y 坐标
;~ 返回值: 同 MsgBox() 的返回值
;~ 例:
$msg = MsgBoxE(3, '_MsgBoxE()示例', _
                '本例对 MsgBox(3, "", "...") 的按钮和位置进行修改:' & @CRLF & @CRLF & _
                '第一个按钮“是”改成“按钮1”' & @CRLF & _
                '第二个按钮“否”改成“修改设置”' & @CRLF & _
                '第三个按钮“取消”不修改' & @CRLF & _
                'x 座标不变,y 座标改成 100', 0, '', '按钮1', '修改设置', '', '', 100)
MsgBox(0, 'MsgBoxE()', '返回:' & $msg)
;===============================================================================
Func MsgBoxE($flag, $title, $text, $timeout = 0, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '', $x = '', $y = '')
 
        ; 参数加在 title 后面传递给 MB__CallBack,避免使用全局变量
        $title &= @crlf & 'B1=' & $Button1 & @crlf & 'B2=' & $Button2 & @crlf & 'B3=' & $Button3 & @crlf & 'x=' & $x & @crlf & 'y=' & $y
 
        Local $hGUI = GUICreate("")
        Local $sFuncName = "GetWindowLongW"
        If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
        Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hGUI, "int", -6)
        Local $hInst = $aResult[0]
 
        $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
        Local $iThreadId = $aResult[0]
 
        Local $hCallBack = DllCallbackRegister("MB__CallBack", "int", "int;hWnd;ptr")
        Local $pCallBack = DllCallbackGetPtr($hCallBack)
 
        $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", 5, "ptr", $pCallBack, "handle", $hInst, "dword", $iThreadId)
        Local $hHook = $aResult[0]
 
        Local $msg = MsgBox($flag, $title, $text, $timeout, $hwnd)
 
        GUIDelete($hGUI)
        DllCall("user32.dll", "bool", "UnhookWindowsHookEx", "handle", $hHook)
        DllCallbackFree($hCallBack)
        Return $msg
EndFunc   ;==>MsgBoxE
 
Func MB__CallBack($iCode, $wParam, $lParam)
;~         ConsoleWrite('$iCode=' & $iCode & ', $wParam=' & $wParam & ', $lParam=' & $lParam & @CRLF)
 
        If $iCode = 5 Then
 
                Local $title = WinGetTitle($wParam)
                If Not StringInStr($title, @crlf & 'B1=') Then Return
 
                Local $match = StringRegExp($title, '(?i)\r\nB1=(.*)\r\nB2=(.*)\r\nB3=(.*)\r\nx=(.*)\r\ny=(.*)', 1)
                If @error Then Return
 
                ; 改回 title
                $title = StringRegExpReplace($title, '(?i)(?s)\r\nB1=.*', '')
                WinSetTitle($wParam, '', $title)
 
                ; 移动 MsgBox 位置
                If $match[3] <> '' Or $match[4] <> '' Then
                        If $match[3] = '' Then $match[3] = Default
                        If $match[4] = '' Then $match[4] = Default
                        WinMove($wParam, '', $match[3], $match[4])
                EndIf
 
                ; 修改按钮文字
                If $match[0] <> '' Then ControlSetText($wParam, '', 'Button1', $match[0])
                If $match[1] <> '' Then ControlSetText($wParam, '', 'Button2', $match[1])
                If $match[2] <> '' Then ControlSetText($wParam, '', 'Button3', $match[2])
        EndIf
EndFunc   ;==>MB__CallBack
上面这个代码如何修改如何做到象下面如此
$MsgBox = MsgBox(3 + 32, "", "是否启用手写面板笔和墨迹功能?")
Select
        Case $MsgBox = 6 ;启用
             RunWait

        Case $MsgBox = 7 ;停用
             RunWait

        Case $MsgBox = 2  ;取消                
EndSelect
这样按按钮就可以执行相关程序?
发表于 2017-1-9 11:11:07 | 显示全部楼层
回复 1# 令狐大虾
是这个意思?

Global $msg
$msg = MsgBoxE(3, '_MsgBoxE()示例', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停用', '退出', '', 100)
Select
        Case $msg = 6 ;启用
                MsgBox(0, '', "选择启用")
        Case $msg = 7 ;停用
                MsgBox(0, '', "选择停用")
        Case $msg = 2 ;取消
                MsgBox(0, '', "选择退出")
EndSelect
 楼主| 发表于 2017-1-9 16:42:24 | 显示全部楼层
回复  令狐大虾
是这个意思?
chzj589 发表于 2017-1-9 11:11

是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文字显示
发表于 2017-1-9 18:34:53 | 显示全部楼层
回复 3# 令狐大虾


    仔细看帮助文件,原生msgbox函数只有几种按钮形式,不支持自定义显示...
发表于 2017-1-9 20:01:52 | 显示全部楼层
是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文 ...
令狐大虾 发表于 2017-1-9 16:42

2楼的代码就是可修改文字,要把代码全部发上来?

;===============================================================================
;~ 参考: http://www.autoitx.com/forum.php ... p;extra=&page=3
;~ 函数: MsgBoxE()
;~ 描述: 修改 MsgBox() 的位置或按钮文字
;~ 作者:甲壳虫
;~ 参数:
;~ $flag = MsgBox() 的 flag
;~ $title = MsgBox() 标题
;~ $text = MsgBox() 的信息内容
;~ $timeout = MsgBox() 超时
;~ $hwnd = MsgBox() 的 hwnd
;~ $Button1 = 第一个按钮要显示的文字
;~ $Button2 = 第二个按钮要显示的文字
;~ $Button3 = 第三个按钮要显示的文字
;~ $x = MsgBox() 的 x 坐标
;~ $y = MsgBox() 的 y 坐标
;~ 返回值: 同 MsgBox() 的返回值
;~ 例:
;Global $msg

#cs
        $msg = MsgBoxE(3, '_MsgBoxE()示例', _
        '本例对 MsgBox(3, "", "...") 的按钮和位置进行修改:' & @CRLF & @CRLF & _
        '第一个按钮“是”改成“按钮1”' & @CRLF & _
        '第二个按钮“否”改成“修改设置”' & @CRLF & _
        '第三个按钮“取消”不修改' & @CRLF & _
        'x 座标不变,y 座标改成 100', 0, '', '启用', '停用', '退出', '', 100)
        ;提示:是=启用、否=停用、取消=退出
        ;MsgBox(0, 'MsgBoxE()', '返回:' & $msg)
#ce

Global $msg
$msg = MsgBoxE(3, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停用', '退出', '', 60)
Select
        Case $msg = 6 ;启用
                MsgBox(0, '', "选择启用")
                ;添加要执行的代码 
        Case $msg = 7 ;停用
                MsgBox(0, '', "选择停用")
                ;添加要执行的代码                 
        Case $msg = 2 ;取消
                MsgBox(0, '', "选择退出",1)
                        
EndSelect


;===============================================================================
Func MsgBoxE($flag, $title, $text, $timeout = 0, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '', $x = '', $y = '')
        ; 参数加在 title 后面传递给 MB__CallBack,避免使用全局变量
        $title &= @CRLF & 'B1=' & $Button1 & @CRLF & 'B2=' & $Button2 & @CRLF & 'B3=' & $Button3 & @CRLF & 'x=' & $x & @CRLF & 'y=' & $y
        Local $hGUI = GUICreate("")
        Local $sFuncName = "GetWindowLongW"
        If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
        Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hGUI, "int", -6)
        Local $hInst = $aResult[0]
        $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
        Local $iThreadId = $aResult[0]
        Local $hCallBack = DllCallbackRegister("MB__CallBack", "int", "int;hWnd;ptr")
        Local $pCallBack = DllCallbackGetPtr($hCallBack)
        $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", 5, "ptr", $pCallBack, "handle", $hInst, "dword", $iThreadId)
        Local $hHook = $aResult[0]
        Local $msg = MsgBox($flag, $title, $text, $timeout, $hwnd)
        GUIDelete($hGUI)
        DllCall("user32.dll", "bool", "UnhookWindowsHookEx", "handle", $hHook)
        DllCallbackFree($hCallBack)
        Return $msg
EndFunc   ;==>MsgBoxE
Func MB__CallBack($iCode, $wParam, $lParam)
;~         ConsoleWrite('$iCode=' & $iCode & ', $wParam=' & $wParam & ', $lParam=' & $lParam & @CRLF)
        If $iCode = 5 Then
                Local $title = WinGetTitle($wParam)
                If Not StringInStr($title, @CRLF & 'B1=') Then Return
                Local $match = StringRegExp($title, '(?i)\r\nB1=(.*)\r\nB2=(.*)\r\nB3=(.*)\r\nx=(.*)\r\ny=(.*)', 1)
                If @error Then Return
                ; 改回 title
                $title = StringRegExpReplace($title, '(?i)(?s)\r\nB1=.*', '')
                WinSetTitle($wParam, '', $title)
                ; 移动 MsgBox 位置
                If $match[3] <> '' Or $match[4] <> '' Then
                        If $match[3] = '' Then $match[3] = Default
                        If $match[4] = '' Then $match[4] = Default
                        WinMove($wParam, '', $match[3], $match[4])
                EndIf
                ; 修改按钮文字
                If $match[0] <> '' Then ControlSetText($wParam, '', 'Button1', $match[0])
                If $match[1] <> '' Then ControlSetText($wParam, '', 'Button2', $match[1])
                If $match[2] <> '' Then ControlSetText($wParam, '', 'Button3', $match[2])
        EndIf
EndFunc   ;==>MB__CallBack

 楼主| 发表于 2017-1-9 20:36:16 | 显示全部楼层
本帖最后由 令狐大虾 于 2017-1-9 20:37 编辑

回复 5# chzj589
真心感谢你!我昨晚搜索到这个代码,我也曾经如你这般修改,但是我去掉了返回命令所以失败。
以下是看了你修改之后得到我所需要的结果:
$msg = MsgBoxE(3, '提示','是否安装 Windows 10 Enterprise 2016 LTSB?', 0, '', '安装64位', '安装32位', '', '',200)
Select
        Case $msg = 6 ;启用
                MsgBox(0, '', "正在安装Windows 10 Enterprise 2016 LTSB x64",3)
                ;添加要执行的代码 
        Case $msg = 7 ;停用
                MsgBox(0, '', "正在安装Windows 10 Enterprise 2016 LTSB x86",3)
                ;添加要执行的代码              
        Case $msg = 2 ;取消
                MsgBox(0, '', "选择退出",1)
                        
EndSelect
;===============================================================================
Func MsgBoxE($flag, $title, $text, $timeout = 0, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '', $x = '', $y = '')
        ; 参数加在 title 后面传递给 MB__CallBack,避免使用全局变量
        $title &= @CRLF & 'B1=' & $Button1 & @CRLF & 'B2=' & $Button2 & @CRLF & 'B3=' & $Button3 & @CRLF & 'x=' & $x & @CRLF & 'y=' & $y
        Local $hGUI = GUICreate("")
        Local $sFuncName = "GetWindowLongW"
        If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
        Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hGUI, "int", -6)
        Local $hInst = $aResult[0]
        $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
        Local $iThreadId = $aResult[0]
        Local $hCallBack = DllCallbackRegister("MB__CallBack", "int", "int;hWnd;ptr")
        Local $pCallBack = DllCallbackGetPtr($hCallBack)
        $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", 5, "ptr", $pCallBack, "handle", $hInst, "dword", $iThreadId)
        Local $hHook = $aResult[0]
        Local $msg = MsgBox($flag, $title, $text, $timeout, $hwnd)
        GUIDelete($hGUI)
        DllCall("user32.dll", "bool", "UnhookWindowsHookEx", "handle", $hHook)
        DllCallbackFree($hCallBack)
        Return $msg
EndFunc   ;==>MsgBoxE
Func MB__CallBack($iCode, $wParam, $lParam)
;~         ConsoleWrite('$iCode=' & $iCode & ', $wParam=' & $wParam & ', $lParam=' & $lParam & @CRLF)
        If $iCode = 5 Then
                Local $title = WinGetTitle($wParam)
                If Not StringInStr($title, @CRLF & 'B1=') Then Return
                Local $match = StringRegExp($title, '(?i)\r\nB1=(.*)\r\nB2=(.*)\r\nB3=(.*)\r\nx=(.*)\r\ny=(.*)', 1)
                If @error Then Return
                ; 改回 title
                $title = StringRegExpReplace($title, '(?i)(?s)\r\nB1=.*', '')
                WinSetTitle($wParam, '', $title)
                ; 移动 MsgBox 位置
                If $match[3] <> '' Or $match[4] <> '' Then
                        If $match[3] = '' Then $match[3] = Default
                        If $match[4] = '' Then $match[4] = Default
                        WinMove($wParam, '', $match[3], $match[4])
                EndIf
                ; 修改按钮文字
                If $match[0] <> '' Then ControlSetText($wParam, '', 'Button1', $match[0])
                If $match[1] <> '' Then ControlSetText($wParam, '', 'Button2', $match[1])
                If $match[2] <> '' Then ControlSetText($wParam, '', 'Button3', $match[2])
        EndIf
EndFunc   ;==>MB__CallBack
效果图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-1-9 20:43:13 | 显示全部楼层
回复  chzj589
真心感谢你!我昨晚搜索到这个代码,我也曾经如你这般修改,但是我去掉了返回命令所以失败 ...
令狐大虾 发表于 2017-1-9 20:36

你没注意返回结果:
$msg = MsgBoxE(1, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停用', '退出', '', 60)
MsgBox(0, 'MsgBoxE()', '返回:' & $msg)
$msg = MsgBoxE(1,
$msg = MsgBoxE(2,
$msg = MsgBoxE(3,
返回结果都不一样,
MsgBox(0, 'MsgBoxE()', '返回:' & $msg),这句得到的结果,就可修改
Case $msg = ?
发表于 2017-1-9 20:53:16 | 显示全部楼层
回复 1# 令狐大虾

令狐大侠最近很活跃啊~
 楼主| 发表于 2017-1-9 20:59:28 | 显示全部楼层
你没注意返回结果:
$msg = MsgBoxE(1, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停 ...
chzj589 发表于 2017-1-9 20:43


我昨晚是干掉了Return $msg
 楼主| 发表于 2017-1-9 21:03:44 | 显示全部楼层
回复  令狐大虾

令狐大侠最近很活跃啊~
austere 发表于 2017-1-9 20:53

怎么说呢?主要精力都是放在系统制作和研究上面。我在后悔为啥07年时候我居然不知道学AU3居然瞎折腾最没技术含量的GHOST系统,纳闷。如今系统制作运用到的调用之类比以前复杂无数倍,不借助语言例如AU3的话寸步难行。话说我都没看到AU3基础哈哈,就是到处看直接拿源码修改,而且还一知半解的。我都是想到什么才去实施解决
发表于 2017-1-9 21:10:42 | 显示全部楼层
回复 10# 令狐大虾


    批处理也能实现的...
发表于 2017-1-9 22:39:43 | 显示全部楼层
回复 11# 邪恶海盗


    我很想知道你这个海盗是不是无忧那个海盗?
 楼主| 发表于 2017-1-9 23:19:34 | 显示全部楼层
回复 12# austere
当然是他,很多BBS都见他。N年前在扬帆和他交过手
发表于 2017-1-10 00:08:25 | 显示全部楼层
回复 12# austere


   如果你说的是"邪恶海盗",那就是了
发表于 2017-1-10 00:08:48 | 显示全部楼层
回复 13# 令狐大虾


    扬帆人气太低,去了没几天撤了...
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-20 06:44 , Processed in 0.088025 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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