ViSiToR
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору U235 23:14 21-12-2008 Цитата: Можно ли сделать так, чтобы кнопка B2 (перехватывалось нажатие) работала, когда выполняется функция test1? | Можно, примерно так... Код: #include <Timers.au3> Global $aEvents_Data[1][2] Global $hOnEvent_Timer = -1 Global $iEnd_Function = False HotKeySet("{ESC}", "Quit") Opt("GUIOnEventMode", 1) $hGUI = GUICreate("Test", 180, 100, 60, 200) $Button = GUICtrlCreateButton("B1", 50, 50, 70, 20) GUICtrlSetOnEvent(-1, "Test1") $Button2 = GUICtrlCreateButton("B2", 50, 80, 70, 20) _GUICtrlSetOnEvent(-1, "Test2") ;Используем эту функцию на элементах, которые будут прерывать цикл при событии (при их вызове) GUISetState(@SW_SHOW, $hGUI) $hOnEvent_Timer = _Timer_SetTimer($hGUI, 100, "_Set_EndFunction_Proc") While 1 Sleep(100) WEnd Func Test1() TrayTip("", "", 1) ;Чтобы определить начало функции Local $iCount = 1 ;Для демонстрации While 1 Sleep(100) ConsoleWrite("Looping in process... " & $iCount & @CRLF) $iCount += 1 If $iEnd_Function Then ExitLoop WEnd EndFunc Func Test2() TrayTip("test", "test", 1) EndFunc Func _Set_EndFunction_Proc($hWnd, $Msg, $iIDTimer, $dwTime) Local $aCurInfo = GUIGetCursorInfo($hGUI) If Not IsArray($aCurInfo) Then Return _Timer_KillTimer($hGUI, $hOnEvent_Timer) For $i = 1 To $aEvents_Data[0][0] If $aCurInfo[2] = 1 And $aCurInfo[4] = $aEvents_Data[$i][0] Then ;While $aCurInfo[2] = 1 ;$aCurInfo = GUIGetCursorInfo() ;If Not IsArray($aCurInfo) Then ExitLoop ;Sleep(1) ;WEnd ;$aCurInfo = GUIGetCursorInfo() ;If IsArray($aCurInfo) And $aCurInfo[4] = $aEvents_Data[$i][0] Then $iEnd_Function = True $iEnd_Function = True ExitLoop EndIf Next $hOnEvent_Timer = _Timer_SetTimer($hGUI, 100, "_Set_EndFunction_Proc") EndFunc Func _GUICtrlSetOnEvent($iCtrlID, $sFuncName) Local $iEventSet, $iItem = 0 If $iCtrlID = -1 Then $iCtrlID = _GUIGetLastCtrlID() For $i = 1 To $aEvents_Data[0][0] If $aEvents_Data[$i][0] = $iCtrlID Then $iItem = $i ;We are replacing previous settings ExitLoop EndIf Next If $iItem = 0 Then ;Control has not been set before $aEvents_Data[0][0] += 1 $iItem = $aEvents_Data[0][0] ReDim $aEvents_Data[$iItem+1][2] EndIf GUICtrlSetOnEvent($iCtrlID, "_Ctrl_Events_Func") $aEvents_Data[$iItem][0] = $iCtrlID ;the control ID $aEvents_Data[$iItem][1] = $sFuncName ;the function to call Return 1 ;Success EndFunc Func _Ctrl_Events_Func() For $i = 1 To $aEvents_Data[0][0] If $aEvents_Data[$i][0] = @GUI_CtrlId Then $iEnd_Function = False Call($aEvents_Data[$i][1], @GUI_CtrlId) If @error Then Call($aEvents_Data[$i][1]) ExitLoop EndIf Next EndFunc Func _GUIGetLastCtrlID() Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1)) Return $aRet[0] EndFunc Func Quit() _Timer_KillTimer($hGUI, $hOnEvent_Timer) Exit EndFunc | Может быть не очень стабильно, но пока вроде работает
---------- ViSiToR a.k.a CreatoR CreatoR это не ник, CreatoR это стиль жизни! |
| Всего записей: 3251 | Зарегистр. 01-04-2006 | Отправлено: 02:31 22-12-2008 | Исправлено: ViSiToR, 02:40 22-12-2008 |
|