Board logo

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

作者: 令狐大虾    时间: 2017-1-9 09:40     标题: [已解决]自定义MsgBox的位置和按钮文字后添加select执行程序?谢谢chzj589

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

看到一个帖子http://www.autoitx.com/viewthrea ... mp;highlight=MsgBox里面的第三个
  1. ;===============================================================================
  2. ;~ 参考: [url]http://www.autoitx.com/viewthread.php?tid=13550&extra=&page=3[/url]
  3. ;~ 函数: MsgBoxE()
  4. ;~ 描述: 修改 MsgBox() 的位置或按钮文字
  5. ;~ 作者:甲壳虫
  6. ;~ 参数:
  7. ;~ $flag = MsgBox() 的 flag
  8. ;~ $title = MsgBox() 标题
  9. ;~ $text = MsgBox() 的信息内容
  10. ;~ $timeout = MsgBox() 超时
  11. ;~ $hwnd = MsgBox() 的 hwnd
  12. ;~ $Button1 = 第一个按钮要显示的文字
  13. ;~ $Button2 = 第二个按钮要显示的文字
  14. ;~ $Button3 = 第三个按钮要显示的文字
  15. ;~ $x = MsgBox() 的 x 坐标
  16. ;~ $y = MsgBox() 的 y 坐标
  17. ;~ 返回值: 同 MsgBox() 的返回值
  18. ;~ 例:
  19. $msg = MsgBoxE(3, '_MsgBoxE()示例', _
  20.                 '本例对 MsgBox(3, "", "...") 的按钮和位置进行修改:' & @CRLF & @CRLF & _
  21.                 '第一个按钮“是”改成“按钮1”' & @CRLF & _
  22.                 '第二个按钮“否”改成“修改设置”' & @CRLF & _
  23.                 '第三个按钮“取消”不修改' & @CRLF & _
  24.                 'x 座标不变,y 座标改成 100', 0, '', '按钮1', '修改设置', '', '', 100)
  25. MsgBox(0, 'MsgBoxE()', '返回:' & $msg)
  26. ;===============================================================================
  27. Func MsgBoxE($flag, $title, $text, $timeout = 0, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '', $x = '', $y = '')

  28.         ; 参数加在 title 后面传递给 MB__CallBack,避免使用全局变量
  29.         $title &= @crlf & 'B1=' & $Button1 & @crlf & 'B2=' & $Button2 & @crlf & 'B3=' & $Button3 & @crlf & 'x=' & $x & @crlf & 'y=' & $y

  30.         Local $hGUI = GUICreate("")
  31.         Local $sFuncName = "GetWindowLongW"
  32.         If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
  33.         Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hGUI, "int", -6)
  34.         Local $hInst = $aResult[0]

  35.         $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
  36.         Local $iThreadId = $aResult[0]

  37.         Local $hCallBack = DllCallbackRegister("MB__CallBack", "int", "int;hWnd;ptr")
  38.         Local $pCallBack = DllCallbackGetPtr($hCallBack)

  39.         $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", 5, "ptr", $pCallBack, "handle", $hInst, "dword", $iThreadId)
  40.         Local $hHook = $aResult[0]

  41.         Local $msg = MsgBox($flag, $title, $text, $timeout, $hwnd)

  42.         GUIDelete($hGUI)
  43.         DllCall("user32.dll", "bool", "UnhookWindowsHookEx", "handle", $hHook)
  44.         DllCallbackFree($hCallBack)
  45.         Return $msg
  46. EndFunc   ;==>MsgBoxE

  47. Func MB__CallBack($iCode, $wParam, $lParam)
  48. ;~         ConsoleWrite('$iCode=' & $iCode & ', $wParam=' & $wParam & ', $lParam=' & $lParam & @CRLF)

  49.         If $iCode = 5 Then

  50.                 Local $title = WinGetTitle($wParam)
  51.                 If Not StringInStr($title, @crlf & 'B1=') Then Return

  52.                 Local $match = StringRegExp($title, '(?i)\r\nB1=(.*)\r\nB2=(.*)\r\nB3=(.*)\r\nx=(.*)\r\ny=(.*)', 1)
  53.                 If @error Then Return

  54.                 ; 改回 title
  55.                 $title = StringRegExpReplace($title, '(?i)(?s)\r\nB1=.*', '')
  56.                 WinSetTitle($wParam, '', $title)

  57.                 ; 移动 MsgBox 位置
  58.                 If $match[3] <> '' Or $match[4] <> '' Then
  59.                         If $match[3] = '' Then $match[3] = Default
  60.                         If $match[4] = '' Then $match[4] = Default
  61.                         WinMove($wParam, '', $match[3], $match[4])
  62.                 EndIf

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

  5.         Case $MsgBox = 7 ;停用
  6.              RunWait

  7.         Case $MsgBox = 2  ;取消               
  8. EndSelect
复制代码
这样按按钮就可以执行相关程序?
作者: chzj589    时间: 2017-1-9 11:11

回复 1# 令狐大虾
是这个意思?
  1. Global $msg

  2. $msg = MsgBoxE(3, '_MsgBoxE()示例', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停用', '退出', '', 100)


  3.         Case $msg = 6 ;启用

  4.                 MsgBox(0, '', "选择启用")

  5.         Case $msg = 7 ;停用

  6.                 MsgBox(0, '', "选择停用")

  7.         Case $msg = 2 ;取消

  8.                 MsgBox(0, '', "选择退出")


复制代码 高亮切换

作者: 令狐大虾    时间: 2017-1-9 16:42

回复  令狐大虾
是这个意思?
chzj589 发表于 2017-1-9 11:11

是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文字显示
作者: 邪恶海盗    时间: 2017-1-9 18:34

回复 3# 令狐大虾


    仔细看帮助文件,原生msgbox函数只有几种按钮形式,不支持自定义显示...
作者: chzj589    时间: 2017-1-9 20:01

是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文 ...
令狐大虾 发表于 2017-1-9 16:42

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

  2. ;~ 参考: [url]http://www.autoitx.com/viewthread.php?tid=13550&extra=&page=3[/url]

  3. ;~ 函数: MsgBoxE()

  4. ;~ 描述: 修改 MsgBox() 的位置或按钮文字

  5. ;~ 作者:甲壳虫

  6. ;~ 参数:

  7. ;~ $flag = MsgBox() 的 flag

  8. ;~ $title = MsgBox() 标题

  9. ;~ $text = MsgBox() 的信息内容

  10. ;~ $timeout = MsgBox() 超时

  11. ;~ $hwnd = MsgBox() 的 hwnd

  12. ;~ $Button1 = 第一个按钮要显示的文字

  13. ;~ $Button2 = 第二个按钮要显示的文字

  14. ;~ $Button3 = 第三个按钮要显示的文字

  15. ;~ $x = MsgBox() 的 x 坐标

  16. ;~ $y = MsgBox() 的 y 坐标

  17. ;~ 返回值: 同 MsgBox() 的返回值

  18. ;~ 例:

  19. ;Global $msg

  20.  

  21. #cs

  22.         $msg = MsgBoxE(3, '_MsgBoxE()示例', _

  23.         '本例对 MsgBox(3, "", "...") 的按钮和位置进行修改:' & @CRLF & @CRLF & _

  24.         '第一个按钮“是”改成“按钮1”' & @CRLF & _

  25.         '第二个按钮“否”改成“修改设置”' & @CRLF & _

  26.         '第三个按钮“取消”不修改' & @CRLF & _

  27.         'x 座标不变,y 座标改成 100', 0, '', '启用', '停用', '退出', '', 100)

  28.         ;提示:是=启用、否=停用、取消=退出

  29.         ;MsgBox(0, 'MsgBoxE()', '返回:' & $msg)

  30. #ce

  31.  

  32. Global $msg

  33. $msg = MsgBoxE(3, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停用', '退出', '', 60)


  34.         Case $msg = 6 ;启用

  35.                 MsgBox(0, '', "选择启用")

  36.                 ;添加要执行的代码 

  37.         Case $msg = 7 ;停用

  38.                 MsgBox(0, '', "选择停用")

  39.                 ;添加要执行的代码             

  40.         Case $msg = 2 ;取消

  41.                 MsgBox(0, '', "选择退出",1)

  42.                        


  43.  

  44.  

  45. ;===============================================================================

  46. Func MsgBoxE($flag, $title, $text, $timeout = 0, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '', $x = '', $y = '')

  47.         ; 参数加在 title 后面传递给 MB__CallBack,避免使用全局变量

  48.         $title &= @CRLF & 'B1=' & $Button1 & @CRLF & 'B2=' & $Button2 & @CRLF & 'B3=' & $Button3 & @CRLF & 'x=' & $x & @CRLF & 'y=' & $y

  49.         Local $hGUI = GUICreate("")

  50.         Local $sFuncName = "GetWindowLongW"

  51.         If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"

  52.         Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hGUI, "int", -6)

  53.         Local $hInst = $aResult[0]

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

  55.         Local $iThreadId = $aResult[0]

  56.         Local $hCallBack = DllCallbackRegister("MB__CallBack", "int", "int;hWnd;ptr")

  57.         Local $pCallBack = DllCallbackGetPtr($hCallBack)

  58.         $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", 5, "ptr", $pCallBack, "handle", $hInst, "dword", $iThreadId)

  59.         Local $hHook = $aResult[0]

  60.         Local $msg = MsgBox($flag, $title, $text, $timeout, $hwnd)

  61.         GUIDelete($hGUI)

  62.         DllCall("user32.dll", "bool", "UnhookWindowsHookEx", "handle", $hHook)

  63.         DllCallbackFree($hCallBack)

  64.         Return $msg

  65. EndFunc   ;==>MsgBoxE

  66. Func MB__CallBack($iCode, $wParam, $lParam)

  67. ;~         ConsoleWrite('$iCode=' & $iCode & ', $wParam=' & $wParam & ', $lParam=' & $lParam & @CRLF)

  68.         If $iCode = 5 Then

  69.                 Local $title = WinGetTitle($wParam)

  70.                 If Not StringInStr($title, @CRLF & 'B1=') Then Return

  71.                 Local $match = StringRegExp($title, '(?i)\r\nB1=(.*)\r\nB2=(.*)\r\nB3=(.*)\r\nx=(.*)\r\ny=(.*)', 1)

  72.                 If @error Then Return

  73.                 ; 改回 title

  74.                 $title = StringRegExpReplace($title, '(?i)(?s)\r\nB1=.*', '')

  75.                 WinSetTitle($wParam, '', $title)

  76.                 ; 移动 MsgBox 位置

  77.                 If $match[3] <> '' Or $match[4] <> '' Then

  78.                         If $match[3] = '' Then $match[3] = Default

  79.                         If $match[4] = '' Then $match[4] = Default

  80.                         WinMove($wParam, '', $match[3], $match[4])

  81.                 EndIf

  82.                 ; 修改按钮文字

  83.                 If $match[0] <> '' Then ControlSetText($wParam, '', 'Button1', $match[0])

  84.                 If $match[1] <> '' Then ControlSetText($wParam, '', 'Button2', $match[1])

  85.                 If $match[2] <> '' Then ControlSetText($wParam, '', 'Button3', $match[2])

  86.         EndIf

  87. EndFunc   ;==>MB__CallBack

复制代码 高亮切换

作者: 令狐大虾    时间: 2017-1-9 20:36

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

回复 5# chzj589
真心感谢你!我昨晚搜索到这个代码,我也曾经如你这般修改,但是我去掉了返回命令所以失败。
以下是看了你修改之后得到我所需要的结果:
  1. $msg = MsgBoxE(3, '提示','是否安装 Windows 10 Enterprise 2016 LTSB?', 0, '', '安装64位', '安装32位', '', '',200)
  2. Select
  3.         Case $msg = 6 ;启用
  4.                 MsgBox(0, '', "正在安装Windows 10 Enterprise 2016 LTSB x64",3)
  5.                 ;添加要执行的代码 
  6.         Case $msg = 7 ;停用
  7.                 MsgBox(0, '', "正在安装Windows 10 Enterprise 2016 LTSB x86",3)
  8.                 ;添加要执行的代码             
  9.         Case $msg = 2 ;取消
  10.                 MsgBox(0, '', "选择退出",1)
  11.                         
  12. EndSelect
  13. ;===============================================================================
  14. Func MsgBoxE($flag, $title, $text, $timeout = 0, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '', $x = '', $y = '')
  15.         ; 参数加在 title 后面传递给 MB__CallBack,避免使用全局变量
  16.         $title &= @CRLF & 'B1=' & $Button1 & @CRLF & 'B2=' & $Button2 & @CRLF & 'B3=' & $Button3 & @CRLF & 'x=' & $x & @CRLF & 'y=' & $y
  17.         Local $hGUI = GUICreate("")
  18.         Local $sFuncName = "GetWindowLongW"
  19.         If @AutoItX64 Then $sFuncName = "GetWindowLongPtrW"
  20.         Local $aResult = DllCall("user32.dll", "long_ptr", $sFuncName, "hwnd", $hGUI, "int", -6)
  21.         Local $hInst = $aResult[0]
  22.         $aResult = DllCall("kernel32.dll", "dword", "GetCurrentThreadId")
  23.         Local $iThreadId = $aResult[0]
  24.         Local $hCallBack = DllCallbackRegister("MB__CallBack", "int", "int;hWnd;ptr")
  25.         Local $pCallBack = DllCallbackGetPtr($hCallBack)
  26.         $aResult = DllCall("user32.dll", "handle", "SetWindowsHookEx", "int", 5, "ptr", $pCallBack, "handle", $hInst, "dword", $iThreadId)
  27.         Local $hHook = $aResult[0]
  28.         Local $msg = MsgBox($flag, $title, $text, $timeout, $hwnd)
  29.         GUIDelete($hGUI)
  30.         DllCall("user32.dll", "bool", "UnhookWindowsHookEx", "handle", $hHook)
  31.         DllCallbackFree($hCallBack)
  32.         Return $msg
  33. EndFunc   ;==>MsgBoxE
  34. Func MB__CallBack($iCode, $wParam, $lParam)
  35. ;~         ConsoleWrite('$iCode=' & $iCode & ', $wParam=' & $wParam & ', $lParam=' & $lParam & @CRLF)
  36.         If $iCode = 5 Then
  37.                 Local $title = WinGetTitle($wParam)
  38.                 If Not StringInStr($title, @CRLF & 'B1=') Then Return
  39.                 Local $match = StringRegExp($title, '(?i)\r\nB1=(.*)\r\nB2=(.*)\r\nB3=(.*)\r\nx=(.*)\r\ny=(.*)', 1)
  40.                 If @error Then Return
  41.                 ; 改回 title
  42.                 $title = StringRegExpReplace($title, '(?i)(?s)\r\nB1=.*', '')
  43.                 WinSetTitle($wParam, '', $title)
  44.                 ; 移动 MsgBox 位置
  45.                 If $match[3] <> '' Or $match[4] <> '' Then
  46.                         If $match[3] = '' Then $match[3] = Default
  47.                         If $match[4] = '' Then $match[4] = Default
  48.                         WinMove($wParam, '', $match[3], $match[4])
  49.                 EndIf
  50.                 ; 修改按钮文字
  51.                 If $match[0] <> '' Then ControlSetText($wParam, '', 'Button1', $match[0])
  52.                 If $match[1] <> '' Then ControlSetText($wParam, '', 'Button2', $match[1])
  53.                 If $match[2] <> '' Then ControlSetText($wParam, '', 'Button3', $match[2])
  54.         EndIf
  55. EndFunc   ;==>MB__CallBack
复制代码
效果图
[attach]31576[/attach]
作者: chzj589    时间: 2017-1-9 20:43

回复  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 = ?
作者: austere    时间: 2017-1-9 20:53

回复 1# 令狐大虾

令狐大侠最近很活跃啊~
作者: 令狐大虾    时间: 2017-1-9 20:59

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


我昨晚是干掉了Return $msg
作者: 令狐大虾    时间: 2017-1-9 21:03

回复  令狐大虾

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

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

回复 10# 令狐大虾


    批处理也能实现的...
作者: austere    时间: 2017-1-9 22:39

回复 11# 邪恶海盗


    我很想知道你这个海盗是不是无忧那个海盗?
作者: 令狐大虾    时间: 2017-1-9 23:19

回复 12# austere
当然是他,很多BBS都见他。N年前在扬帆和他交过手
作者: 邪恶海盗    时间: 2017-1-10 00:08

回复 12# austere


   如果你说的是"邪恶海盗",那就是了
作者: 邪恶海盗    时间: 2017-1-10 00:08

回复 13# 令狐大虾


    扬帆人气太低,去了没几天撤了...
作者: heroxianf    时间: 2017-1-10 15:11

回复 10# 令狐大虾

时间不是问题  我08就注册了,可是一直没来学习。知道去年~




欢迎光临 AUTOIT CN (http://autoitx.com/) Powered by Discuz! 7.2