fybhwsx 发表于 2019-2-19 09:20:51

求助关于修改A版的_MsgBoxDJS函数,增加自定义按钮文字。【已解决】

本帖最后由 fybhwsx 于 2019-2-21 08:37 编辑


Local $MsgBox_DJS = _MsgBoxDJS(2 + 64 + 0 + 262144, '提示', '增加了按钮文本自定义,取消了A版_MsgBoxDJS的前两种模式,只保留按钮倒计时。这样$Cflag变量和$__Cflag = $Cflag就没用了,因为完全不懂DllCall,' & _
                '请教下A版或懂DllCall的朋友,这两个变量有在DllCall中传递吗,直接删除似乎会导致不稳定?还有就是有点儿强迫症,怎样一开始就显示自定义的按钮文本和倒计时,而不是先显示下MsgBox的默认按钮?希望A版或知道的朋友能帮助实现想法!', 300, '', '', '重装', '跳过', '退出')
MsgBox(262144, '', '按下按钮:' & $MsgBox_DJS)

;_MsgBoxDJS函数 链接 http://www.autoitx.com/forum.php ... =%B5%B9%BC%C6%CA%B1 作者:afan版主
Func _MsgBoxDJS($flag, $title, $text, $timeout = 10, $Cflag = 2, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '')
      Global $___Timer = DllCallbackRegister('__Timer', 'int', 'hwnd;uint;uint;dword')
      If $timeout = '' Or $timeout = -1 Then $timeout = 10
      Global $s__title = $title, $s__text = $text, $__Cflag = $Cflag, $v__zt = 1, $v__ttc = $timeout, $__bttxtFlag = 0, $Button__1 = $Button1, $Button__2 = $Button2, $Button__3 = $Button3
      Global $__Timer_DLL = DllCall('user32.dll', 'uint', 'SetTimer', 'hwnd', 0, 'uint', 0, 'int', 100, 'ptr', DllCallbackGetPtr($___Timer))

      Local $rtMsg = MsgBox($flag, $title, $text, 0, $hwnd)

      DllClose($__Timer_DLL)
      ;DllCallbackFree($___Timer)
      Return $rtMsg
EndFunc   ;==>_MsgBoxDJS

Func __Timer($hwnd, $uiMsg, $idEvent, $dwTime)
      Global $__Timer_DLL, $__bttxtFlag, $__Cflag, $s__title, $v__ttc, $s__text, $v__zt, $___Timer, $s_titleF, $v__TimerJS, $Button__1, $Button__2, $Button__3
      If $idEvent = $__Timer_DLL Then
                Global $s__bttxt, $i_ControlFocus, $n__Static
                If $__bttxtFlag = 0 Then
                        ;WinActivate($s__title)
                        If $Button__1 <> '' Then ControlSetText($s__title, $s__text, 'Button1', $Button__1)
                        If $Button__2 <> '' Then ControlSetText($s__title, $s__text, 'Button2', $Button__2)
                        If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)
                        $i_ControlFocus = ControlGetFocus($s__title)
                        $s__bttxt = ControlGetText($s__title, $s__text, $i_ControlFocus)
                        $__bttxtFlag = 1
                EndIf
                If $v__TimerJS = 9 Then

                        If $i_ControlFocus = 'Button1' Then
                              ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__1 & StringFormat(' %s', $v__ttc - $v__zt))
                              If $Button__2 <> '' Then ControlSetText($s__title, $s__text, 'Button2', $Button__2)
                              If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)
                        ElseIf $i_ControlFocus = 'Button2' Then
                              ControlSetText($s__title, $s__text, 'Button1', $Button__1)
                              ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__2 & StringFormat(' %s', $v__ttc - $v__zt))
                              If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)
                        ElseIf $i_ControlFocus = 'Button3' Then
                              ControlSetText($s__title, $s__text, 'Button1', $Button__1)
                              ControlSetText($s__title, $s__text, 'Button2', $Button__2)
                              ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__3 & StringFormat(' %s', $v__ttc - $v__zt))
                        EndIf

                        If $v__zt = $v__ttc Then
                              DllClose($__Timer_DLL)
                              ;DllCallbackFree($___Timer)
                              ControlClick($s__title, $s__text, $i_ControlFocus, '', 2)
                        EndIf
                        $v__zt += 1
                        $v__TimerJS = 0
                Else
                        $v__TimerJS += 1
                EndIf
      EndIf
EndFunc   ;==>__Timer

fybhwsx 发表于 2019-2-20 13:15:59

Local $MsgBox_DJS = _MsgBoxDJS(2 + 64 + 0 + 262144, '提示', '哈哈,终于让我找到导致倒计时偶尔异常的原因了!Return $rtMsg 这句上面的 DllCallbackFree($___Timer) 不能注释掉,否则倒计时不会停下,' & _
                '虽然先前提示窗口已经关闭,看不到倒计时了,但它依然存在,再次调用_MsgBoxDJS就存在隐患。那既然和 $__Cflag 与 $Cflag 变量没有关系,直接拿掉。其实 $__bttxtFlag 变量和 If $__bttxtFlag = 0 Then 那' & _
                '段代码留下 $i_ControlFocus = ControlGetFocus($s__title, $s__text) 其它也能拿掉,但那样显示默认按钮时间更长了,强迫症就更严重了。。还没做更多测试,不知下面这样修改还有没有其它问题。。', 300, '', '重装', '跳过', '退出')
MsgBox(262144, '', '按下按钮:' & $MsgBox_DJS)

;_MsgBoxDJS函数 链接 http://www.autoitx.com/forum.php?mod=viewthread&tid=11196&highlight=%B5%B9%BC%C6%CA%B1 作者:afan版主
Func _MsgBoxDJS($flag, $title, $text, $timeout = 10, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '')
        Global $___Timer = DllCallbackRegister('__Timer', 'int', 'hwnd;uint;uint;dword')
        If $timeout = '' Or $timeout = -1 Then $timeout = 10
        Global $s__title = $title, $s__text = $text, $v__zt = 1, $v__ttc = $timeout, $__bttxtFlag = 0, $Button__1 = $Button1, $Button__2 = $Button2, $Button__3 = $Button3
        Global $__Timer_DLL = DllCall('user32.dll', 'uint', 'SetTimer', 'hwnd', 0, 'uint', 0, 'int', 100, 'ptr', DllCallbackGetPtr($___Timer))
        Local $rtMsg = MsgBox($flag, $title, $text, 0, $hwnd)
        DllClose($__Timer_DLL)
        DllCallbackFree($___Timer)
        Return $rtMsg
EndFunc   ;==>_MsgBoxDJS

Func __Timer($hwnd, $uiMsg, $idEvent, $dwTime)
        Global $__Timer_DLL, $__bttxtFlag, $s__title, $v__ttc, $s__text, $v__zt, $___Timer, $s_titleF, $v__TimerJS, $Button__1, $Button__2, $Button__3
        If $idEvent = $__Timer_DLL Then
                Global $i_ControlFocus
                If $__bttxtFlag = 0 Then
                        If $Button__1 <> '' Then ControlSetText($s__title, $s__text, 'Button1', $Button__1)
                        If $Button__2 <> '' Then ControlSetText($s__title, $s__text, 'Button2', $Button__2)
                        If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)
                        WinActivate($s__title, $s__text)
                        $i_ControlFocus = ControlGetFocus($s__title, $s__text)
                        $__bttxtFlag = 1
                EndIf
                If $v__TimerJS = 9 Then
                        If $i_ControlFocus = 'Button1' Then
                                ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__1 & StringFormat(' %s', $v__ttc - $v__zt))
                                If $Button__2 <> '' Then ControlSetText($s__title, $s__text, 'Button2', $Button__2)
                                If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)
                        ElseIf $i_ControlFocus = 'Button2' Then
                                ControlSetText($s__title, $s__text, 'Button1', $Button__1)
                                ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__2 & StringFormat(' %s', $v__ttc - $v__zt))
                                If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)
                        ElseIf $i_ControlFocus = 'Button3' Then
                                ControlSetText($s__title, $s__text, 'Button1', $Button__1)
                                ControlSetText($s__title, $s__text, 'Button2', $Button__2)
                                ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__3 & StringFormat(' %s', $v__ttc - $v__zt))
                        EndIf
                        If $v__zt = $v__ttc Then
                                ControlClick($s__title, $s__text, $i_ControlFocus, '', 2)
                        EndIf
                        $v__zt += 1
                        $v__TimerJS = 0
                Else
                        $v__TimerJS += 1
                EndIf
        EndIf
EndFunc   ;==>__Timer

fybhwsx 发表于 2019-2-20 13:43:55

使用自定义按钮文本时,应该注意下按钮标志选择:当需要三个按钮时最好选$MB_ABORTRETRYIGNORE(2),两个按钮时选$MB_YESNO(4),这样可以随便自定义按钮,不用考虑右上角的X关闭按钮干扰选择!

redapple2008 发表于 2019-2-20 14:26:16

没有看明白你的意思!

fybhwsx 发表于 2019-2-20 15:15:07

redapple2008 发表于 2019-2-20 14:26
没有看明白你的意思!

感谢关注,就是修改A版的_MsgBoxDJS函数,增加按钮文字自定义,遇到问题。但这个问题原帖中有说时X64位系统的导致的,解决方法就是注释掉DllCallbackFree($___Timer),所以我就跟着注释掉了那两个DllCallbackFree($___Timer),结果运行_MsgBoxDJS总会出现倒计时异常。才来求助各位,现在问题似乎解决了。正在继续观察。。。

fybhwsx 发表于 2019-2-20 15:24:16

至于强迫症说的问题,我想参考这个帖子http://www.autoitx.com/forum.php?mod=viewthread&tid=54345&extra=&highlight=MsgBox&page=1应该能解决吧。

fybhwsx 发表于 2019-2-20 15:26:23

不过那得等以后学习了DllCall再说了。。

fybhwsx 发表于 2019-2-21 08:33:52

;又小改一下,目前使用一切正常,没白折腾,至少知道了 Return $rtMsg 这句上面的 DllCallbackFree($___Timer) 不能像下面链接中有人说的简单的注释掉!再次感谢A版发布_MsgBoxDJS!Local $MsgBox_DJS = _MsgBoxDJS(2 + 64 + 0 + 262144, '提示', '按钮1、按钮2、按钮3位置可以自由修改成想要的文字了!如果用不到按钮2和按钮3留空或删除。', 300, '', '按钮1', '按钮2', '按钮3')MsgBox(262144, '', '按下按钮:' & $MsgBox_DJS);_MsgBoxDJS函数 链接 http://www.autoitx.com/forum.php?mod=viewthread&tid=11196&highlight=%B5%B9%BC%C6%CA%B1 作者:afan版主Func _MsgBoxDJS($flag, $title, $text, $timeout = 10, $hwnd = '', $Button1 = '', $Button2 = '', $Button3 = '')        Global $___Timer = DllCallbackRegister('__Timer', 'int', 'hwnd;uint;uint;dword')        If $timeout = '' Or $timeout = -1 Then $timeout = 10        Global $s__title = $title, $s__text = $text, $v__zt = 1, $v__ttc = $timeout, $__bttxtFlag = 0, $Button__1 = $Button1, $Button__2 = $Button2, $Button__3 = $Button3        Global $__Timer_DLL = DllCall('user32.dll', 'uint', 'SetTimer', 'hwnd', 0, 'uint', 0, 'int', 100, 'ptr', DllCallbackGetPtr($___Timer))        Local $rtMsg = MsgBox($flag, $title, $text, 0, $hwnd)        DllClose($__Timer_DLL)        DllCallbackFree($___Timer)        Return $rtMsgEndFunc   ;==>_MsgBoxDJSFunc __Timer($hwnd, $uiMsg, $idEvent, $dwTime)        Global $__Timer_DLL, $__bttxtFlag, $s__title, $v__ttc, $s__text, $v__zt, $___Timer, $v__TimerJS, $Button__1, $Button__2, $Button__3        If $idEvent = $__Timer_DLL Then                Global $i_ControlFocus                If $__bttxtFlag = 0 Then                        If $Button__1 <> '' Then ControlSetText($s__title, $s__text, 'Button1', $Button__1)                        If $Button__2 <> '' Then ControlSetText($s__title, $s__text, 'Button2', $Button__2)                        If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)                        WinActivate($s__title)                        $i_ControlFocus = ControlGetFocus($s__title)                        $__bttxtFlag = 1                EndIf                If $v__TimerJS = 9 Then                        If $i_ControlFocus = 'Button1' Then                                ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__1 & StringFormat(' %s', $v__ttc - $v__zt))                                If $Button__2 <> '' Then ControlSetText($s__title, $s__text, 'Button2', $Button__2)                                If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)                        ElseIf $i_ControlFocus = 'Button2' Then                                ControlSetText($s__title, $s__text, 'Button1', $Button__1)                                ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__2 & StringFormat(' %s', $v__ttc - $v__zt))                                If $Button__3 <> '' Then ControlSetText($s__title, $s__text, 'Button3', $Button__3)                        ElseIf $i_ControlFocus = 'Button3' Then                                ControlSetText($s__title, $s__text, 'Button1', $Button__1)                                ControlSetText($s__title, $s__text, 'Button2', $Button__2)                                ControlSetText($s__title, $s__text, $i_ControlFocus, $Button__3 & StringFormat(' %s', $v__ttc - $v__zt))                        EndIf                        If $v__zt = $v__ttc Then                                ControlClick($s__title, $s__text, $i_ControlFocus, 'primary', 2)                        EndIf                        $v__zt += 1                        $v__TimerJS = 0                Else                        $v__TimerJS += 1                EndIf        EndIfEndFunc   ;==>__Timer

redapple2008 发表于 2019-2-21 08:55:54

楼主也是较真的人,支持一下
页: [1]
查看完整版本: 求助关于修改A版的_MsgBoxDJS函数,增加自定义按钮文字。【已解决】