[已解决]自定义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这样按按钮就可以执行相关程序? 回复 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
回复令狐大虾
是这个意思?
chzj589 发表于 2017-1-9 11:11 http://www.autoitx.com/images/common/back.gif
是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文字显示 回复 3# 令狐大虾
仔细看帮助文件,原生msgbox函数只有几种按钮形式,不支持自定义显示... 是这个意思,但是在上面顶部贴出的那个代码修改。意思就是把“确定”,“否”修改为自己任意所想显示的文 ...
令狐大虾 发表于 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: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: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 = ? 回复 1# 令狐大虾
令狐大侠最近很活跃啊~ 你没注意返回结果:
$msg = MsgBoxE(1, '提示', '是否启用手写面板笔和墨迹功能?', 0, '', '启用', '停 ...
chzj589 发表于 2017-1-9 20:43 http://www.autoitx.com/images/common/back.gif
我昨晚是干掉了Return $msg 回复令狐大虾
令狐大侠最近很活跃啊~
austere 发表于 2017-1-9 20:53 http://www.autoitx.com/images/common/back.gif
怎么说呢?主要精力都是放在系统制作和研究上面。我在后悔为啥07年时候我居然不知道学AU3居然瞎折腾最没技术含量的GHOST系统,纳闷。如今系统制作运用到的调用之类比以前复杂无数倍,不借助语言例如AU3的话寸步难行。话说我都没看到AU3基础哈哈,就是到处看直接拿源码修改,而且还一知半解的。我都是想到什么才去实施解决 回复 10# 令狐大虾
批处理也能实现的... 回复 11# 邪恶海盗
我很想知道你这个海盗是不是无忧那个海盗? 回复 12# austere
当然是他,很多BBS都见他。N年前在扬帆和他交过手 回复 12# austere
如果你说的是"邪恶海盗",那就是了 回复 13# 令狐大虾
扬帆人气太低,去了没几天撤了...
页:
[1]
2