令狐大虾 发表于 2017-1-9 09:40:48

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

本帖最后由 令狐大虾 于 2017-1-9 20:39 编辑

看到一个帖子http://www.autoitx.com/forum.php?mod=viewthread&tid=29778&highlight=MsgBox里面的第三个;===============================================================================
;~ 参考: http://www.autoitx.com/forum.php?mod=viewthread&tid=13550&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() 的返回值
;~ 例:
$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

      $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
      Local $iThreadId = $aResult

      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

      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 <> '' Or $match <> '' Then
                        If $match = '' Then $match = Default
                        If $match = '' Then $match = Default
                        WinMove($wParam, '', $match, $match)
                EndIf

                ; 修改按钮文字
                If $match <> '' Then ControlSetText($wParam, '', 'Button1', $match)
                If $match <> '' Then ControlSetText($wParam, '', 'Button2', $match)
                If $match <> '' Then ControlSetText($wParam, '', 'Button3', $match)
      EndIf
EndFunc   ;==>MB__CallBack
上面这个代码如何修改如何做到象下面如此$MsgBox = MsgBox(3 + 32, "", "是否启用手写面板笔和墨迹功能?")
Select
      Case $MsgBox = 6 ;启用
             RunWait

      Case $MsgBox = 7 ;停用
             RunWait

      Case $MsgBox = 2;取消               
EndSelect这样按按钮就可以执行相关程序?

chzj589 发表于 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 http://www.autoitx.com/images/common/back.gif
是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文字显示

邪恶海盗 发表于 2017-1-9 18:34:53

回复 3# 令狐大虾


    仔细看帮助文件,原生msgbox函数只有几种按钮形式,不支持自定义显示...

chzj589 发表于 2017-1-9 20:01:52

是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文 ...
令狐大虾 发表于 2017-1-9 16:42 http://www.autoitx.com/images/common/back.gif
2楼的代码就是可修改文字,要把代码全部发上来?

;===============================================================================
;~ 参考: http://www.autoitx.com/forum.php?mod=viewthread&tid=13550&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
        $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
        Local $iThreadId = $aResult
        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
        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 <> '' Or $match <> '' Then
                        If $match = '' Then $match = Default
                        If $match = '' Then $match = Default
                        WinMove($wParam, '', $match, $match)
                EndIf
                ; 修改按钮文字
                If $match <> '' Then ControlSetText($wParam, '', 'Button1', $match)
                If $match <> '' Then ControlSetText($wParam, '', 'Button2', $match)
                If $match <> '' Then ControlSetText($wParam, '', 'Button3', $match)
        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
      $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
      Local $iThreadId = $aResult
      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
      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 <> '' Or $match <> '' Then
                        If $match = '' Then $match = Default
                        If $match = '' Then $match = Default
                        WinMove($wParam, '', $match, $match)
                EndIf
                ; 修改按钮文字
                If $match <> '' Then ControlSetText($wParam, '', 'Button1', $match)
                If $match <> '' Then ControlSetText($wParam, '', 'Button2', $match)
                If $match <> '' Then ControlSetText($wParam, '', 'Button3', $match)
      EndIf
EndFunc   ;==>MB__CallBack效果图

chzj589 发表于 2017-1-9 20:43:13

回复chzj589
真心感谢你!我昨晚搜索到这个代码,我也曾经如你这般修改,但是我去掉了返回命令所以失败 ...
令狐大虾 发表于 2017-1-9 20:36 http://www.autoitx.com/images/common/back.gif
你没注意返回结果:
$msg = MsgBoxE(1, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停用', '退出', '', 60)
MsgBox(0, 'MsgBoxE()', '返回:' & $msg)
$msg = MsgBoxE(1,
$msg = MsgBoxE(2,
$msg = MsgBoxE(3,
返回结果都不一样,
MsgBox(0, 'MsgBoxE()', '返回:' & $msg),这句得到的结果,就可修改
Case $msg = ?

austere 发表于 2017-1-9 20:53:16

回复 1# 令狐大虾

令狐大侠最近很活跃啊~

令狐大虾 发表于 2017-1-9 20:59:28

你没注意返回结果:
$msg = MsgBoxE(1, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停 ...
chzj589 发表于 2017-1-9 20:43 http://www.autoitx.com/images/common/back.gif

我昨晚是干掉了Return $msg

令狐大虾 发表于 2017-1-9 21:03:44

回复令狐大虾

令狐大侠最近很活跃啊~
austere 发表于 2017-1-9 20:53 http://www.autoitx.com/images/common/back.gif
怎么说呢?主要精力都是放在系统制作和研究上面。我在后悔为啥07年时候我居然不知道学AU3居然瞎折腾最没技术含量的GHOST系统,纳闷。如今系统制作运用到的调用之类比以前复杂无数倍,不借助语言例如AU3的话寸步难行。话说我都没看到AU3基础哈哈,就是到处看直接拿源码修改,而且还一知半解的。我都是想到什么才去实施解决

邪恶海盗 发表于 2017-1-9 21:10:42

回复 10# 令狐大虾


    批处理也能实现的...

austere 发表于 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# 令狐大虾


    扬帆人气太低,去了没几天撤了...
页: [1] 2
查看完整版本: [已解决]自定义MsgBox的位置和按钮文字后添加select执行程序?谢谢chzj589