找回密码
 加入
搜索
楼主: superflq

复杂的 while循环 退出问题?【已完美解决,见最后一楼】

  [复制链接]
 楼主| 发表于 2008-12-12 14:08:46 | 显示全部楼层
原帖由 liongodmien 于 2008-12-12 14:01 发表
有要求也是好的!
[au3]
$Form1 = GUICreate("例子一", 307, 81, -1, -1)
$Button1 = GUICtrlCreateButton("开始", 32, 24, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 176, 24, 97, 33, 0)
GUISetSta ...




嗯,这个办法确实不错,很符合我的要求,就是想问下case -3是什么意思
 楼主| 发表于 2008-12-12 14:13:24 | 显示全部楼层
原帖由 liongodmien 于 2008-12-12 14:04 发表
无论是事件模式还是消息模式,一定要让程序能有空闲时间获得你的动作消息,不然就像电脑假死,没反应!





狮子大哥太厉害了,又学了一招
发表于 2008-12-12 14:19:56 | 显示全部楼层
-3是窗口消息里面关闭窗口的值

我们平常用的$GUI_EVENT_CLOSE就等于-3,当你只用这一个的时候,把一个大大的另外的定义文件引用过来,实在是浪费空间,这也是为什么AU3生成程序后体积大的一个原因,要相对有效的减少生成程序的尺寸,可以在加密那加些相应的参数:/cs=0 /cn=0 /cf=0 /cv=0 /sf=1 /sv=1
 楼主| 发表于 2008-12-12 14:27:54 | 显示全部楼层
喔,原来如此
$GUI_EVENT_CLOSE就等于-3

其他的呢,比如最大化之类的呢,说明文档里有么,
 楼主| 发表于 2008-12-12 14:29:13 | 显示全部楼层
事件 ID 控件发生的消息ID
0 无事件
$GUI_EVENT_CLOSE 对话框(窗口)正被关闭(相关按钮被点击或系统菜单项被选中)  
$GUI_EVENT_MINIMIZE 对话框(窗口)被最小化(窗口标题栏上的最小化按钮被点击)  
$GUI_EVENT_RESTORE 对话框(窗口)被还原(任务栏图标被点击)  
$GUI_EVENT_MAXIMIZE 对话框(窗口)被最大化(窗口标题栏上的最大化按钮被点击)  
$GUI_EVENT_MOUSEMOVE 鼠标光标被移动.  
$GUI_EVENT_PRIMARYDOWN 鼠标的主要按钮被按下.(多指左键)  
$GUI_EVENT_PRIMARYUP 鼠标的主要按钮被松开.(多指左键)  
$GUI_EVENT_SECONDARYDOWN 鼠标的第二个按钮被按下.(多指右键)  
$GUI_EVENT_SECONDARYUP 鼠标的第二个按钮被松开.(多指右键)
$GUI_EVENT_RESIZED dialog box has been resized.
$GUI_EVENT_DROPPED End of a Drag&Drop action @GUI_DRAGID, @GUI_DRAGFILE and @GUI_DROPID will be used to retrieve the ID's/file corresponding to the involve control.


是不是都有代码的?
发表于 2008-12-12 14:41:33 | 显示全部楼层
在AU3目录下用包含搜索可搜到
 楼主| 发表于 2008-12-12 15:10:27 | 显示全部楼层
Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4
Global Const $GUI_EVENT_RESTORE = -5
Global Const $GUI_EVENT_MAXIMIZE = -6
Global Const $GUI_EVENT_PRIMARYDOWN = -7
Global Const $GUI_EVENT_PRIMARYUP = -8
Global Const $GUI_EVENT_SECONDARYDOWN = -9
Global Const $GUI_EVENT_SECONDARYUP = -10
Global Const $GUI_EVENT_MOUSEMOVE = -11
Global Const $GUI_EVENT_RESIZED = -12
Global Const $GUI_EVENT_DROPPED = -13
 楼主| 发表于 2008-12-12 22:19:54 | 显示全部楼层
放上星驰周大哥给我的解决方案,供大家参考

#include 
#include 
#include 
#include 

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 559, 316, 192, 124)
$Button1 = GUICtrlCreateButton("开始循环", 168, 122, 177, 45, 0)
$Button2 = GUICtrlCreateCheckbox("退出循环", 168, 182, 177, 65, 0)
GUICtrlSetState($Button2, $GUI_DISABLE)
$Label1 = GUICtrlCreateLabel("while的退出问题!", 136, 56, 256, 41)
GUICtrlSetFont(-1, 24, 400, 0, "MS Sans Serif")
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
GUICtrlSetState($Button2, $GUI_ENABLE)
GUICtrlSetState($Button2, $GUI_UNCHECKED)
;循环的间隔秒数,显示的次数
Dim $i = 3, $j = 0

While 1
If GUICtrlRead($Button2) = $GUI_CHECKED Then
GUICtrlSetState($Button2, $GUI_DISABLE)
TrayTip("", "", 1)
ExitLoop
EndIf
;------------------以下是自定义代码部分-------------------
Sleep($i * 1000)
$j = $j + 1
TrayTip("脚本正在循环中", "目的是第" & $j & "次", 10, 1)
;------------------以上是自定义代码部分-------------------
WEnd
Case $Button2
MsgBox(0, "你按了退出键", "但是没有退出效果!哈哈", 2)
EndSwitch
WEnd
MsgBox(0, "", "退出成功了")
发表于 2008-12-12 22:41:42 | 显示全部楼层
曾经为这个问题花了很长时间才解决 到底怎么解决  我也忘记的了
我感觉  这个就是au3的很大的一个弊病  以来循环来保持窗体的存在  并且不方便实现多线程
发表于 2008-12-12 23:39:55 | 显示全部楼层
使用HotKey停止 又怕影响其它的软件运行
可以使用判定窗口状态来解决
举例:

HotKeySet ( "{Enter}" ,"GuiExit" )
$Form = GuiCreate("",200,200)
GuiSetState()
while 1
        sleep(50)
wend
Func GuiExit()
        if bitand(WinGetState ( $Form),8 ) then
                exit
        else
                HotKeySet("{Enter}")
                Send("{Enter}")
                HotKeySet("{Enter}", "GuiExit")
        endif
EndFunc
 楼主| 发表于 2008-12-12 23:54:03 | 显示全部楼层
原帖由 文白 于 2008-12-12 23:39 发表
使用HotKey停止 又怕影响其它的软件运行
可以使用判定窗口状态来解决
举例:
[au3]
HotKeySet ( "{Enter}" ,"GuiExit" )
$Form = GuiCreate("",200,200)
GuiSetState()
while 1
        sleep(50)
wend
Func GuiE ...


这个办法也不错,顶一下
发表于 2008-12-13 02:35:18 | 显示全部楼层
经验太多了  收藏 慢慢消化
 楼主| 发表于 2008-12-21 08:50:08 | 显示全部楼层
自己研究了一种最完美的解决方案 利用TIMERS UDF

 
#include <GUIConstants.au3>
#include <Timers.au3>
$Form = GUICreate("例子一", 307, 81, -1, -1)
$Button1 = GUICtrlCreateButton("开始", 32, 24, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 176, 24, 97, 33, 0)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
    Case $GUI_EVENT_CLOSE
              Exit
    Case $Button1
  Dim $i=0
  $iTimeProgres4 = _Timer_SetTimer($Form , 500,'fit')
Case $Button2
  _Timer_KillTimer($Form, $iTimeProgres4)
MsgBox(0,"结果",$i)
EndSwitch
WEnd

Func fit($hWnd, $iMsg, $iwParam, $ilParam)
$i += 1
TrayTip("脚本正在循环中", "目的是第" & $i & "次", 10, 1)
EndFunc


[ 本帖最后由 superflq 于 2008-12-21 08:54 编辑 ]
 楼主| 发表于 2008-12-21 08:55:32 | 显示全部楼层
TIMERS的事件模式,希望对大家有帮助

#include 
#include 
#include 
#include 
$Form = GUICreate("例子一", 307, 81, -1, -1)
$Button1 = GUICtrlCreateButton("开始", 32, 24, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 176, 24, 97, 33, 0)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_TIMER, "WM_TIMER")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Dim $i=0
$iTimeProgres4 = _Timer_SetTimer($Form , 500)
Case $Button2
_Timer_KillTimer($Form, $iTimeProgres4)
MsgBox(0,"结果",$i)
EndSwitch
WEnd

Func WM_TIMER($hWnd, $iMsg, $iwParam, $ilParam)
Switch _Timer_GetTimerID($iwParam)
Case $iTimeProgres4
fit()
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_TIMER

Func fit()
$i += 1
TrayTip("脚本正在循环中", "目的是第" & $i & "次", 10, 1)
EndFunc

发表于 2009-1-17 03:56:17 | 显示全部楼层
呵呵,我再来增加个难题
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <Timers.au3>

$Form = GUICreate("例子一", 307, 81, -1, -1)
$Button1 = GUICtrlCreateButton("开始", 32, 24, 97, 33, 0)
$Button2 = GUICtrlCreateButton("停止", 176, 24, 97, 33, 0)
GUISetState(@SW_SHOW)

GUIRegisterMsg($WM_TIMER, "WM_TIMER")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
Dim $i=0
$iTimeProgres4 = _Timer_SetTimer($Form , 500)
Case $Button2
_Timer_KillTimer($Form, $iTimeProgres4)
MsgBox(0,"结果",$i)
EndSwitch
WEnd

Func WM_TIMER($hWnd, $iMsg, $iwParam, $ilParam)
Switch _Timer_GetTimerID($iwParam)
Case $iTimeProgres4
fit()
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_TIMER

Func fit()
        For $i = 1 To 100
                TrayTip("脚本正在循环中", "目的是第" & $i & "次", 10, 1)
                Sleep(100)
        Next
EndFunc

后面再加个循环,GUI就又死了,楼主的再出点主意看看
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-14 16:06 , Processed in 0.076980 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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