Что нового

Как сделать выход из функции, ожидающей ввод? (внутри код)

Suppir

Продвинутый
Сообщения
967
Репутация
62
Код:
#include <WinAPI.au3>
#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiButton.au3>
#include <GuiMenu.au3>
#Include <GUIEdit.au3>
#include <Date.au3>
#include <File.au3>
#include <Array.au3>
#Include <Timers.au3>
#Include <Misc.au3>
#include <Crypt.au3>

Opt("GUIOnEventMode", 1)
Opt("TrayOnEventMode", 1)
Opt("SendAttachMode", 1)
Opt("TrayMenuMode", 3) 
Opt("TrayAutoPause", 0)
Opt("WinWaitDelay", 0)
Opt("WinTextMatchMode", 2)
Opt("WinSearchChildren", 1)
Opt("SendKeyDownDelay", 50)

TraySetClick (8)
TrayCreateItem("Наша функция")
TrayItemSetOnEvent(-1, "MyFunc")
TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "_Exit")

;~ Основной цикл
While True
	Sleep(50)
Wend
	
;~ Выйти
Func _Exit()
	Exit
EndFunc


Func MyFunc()
	Local $konRaw
	ClipPut("")
	
	TrayTip ("", "Скопируйте информацию в буфер обмена", 1)
	sleep(2000)
	TrayTip ("", "", 1)
	
	while 1
		$konRaw = ClipGet()
		if StringLen($konRaw) > 10 Then ExitLoop
		sleep (100)
		
;~ 		В этом месте нужно сделать так, чтобы можно было
;~ 		закрыть программу мышкой через кнопку TrayCreateItem("Выход")
		
	WEnd

	ConsoleWrite("Помещено в буфер:" & @CRLF & $konRaw)

EndFunc



1) При запуске скрипта создается меню в трее.
2) пользователь нажимает в этом меню кнопку "наша функция"
3) эта функция ожидает, пока пользователь скопирует в буфер обмена информацию, а потом пишет ее в консоль

Во время выполнения этой функции кнопки в меню в трее перестают работать.
Можно ли сделать так, чтобы во время работы функции ее можно было досрочно завершить (return) с помощью клика мышкой по меню, или чтобы можно было закрыть скрипт с помощью клика по элементу "Выход"?
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Код:
Opt("TrayOnEventMode", 0)
    while 1
		If TrayGetMsg() <> 0 Then ExitLoop

        $konRaw = ClipGet()
        if StringLen($konRaw) > 10 Then ExitLoop
;~         sleep (100)

;~      В этом месте нужно сделать так, чтобы можно было
;~      закрыть программу мышкой через кнопку TrayCreateItem("Выход")

    WEnd
	Opt("TrayOnEventMode", 1)
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Только один момент смущает. Так функция прерывается даже если навести мышкой на иконку в трее. А нужно чтобы прерывалось, если нажать на иконку левой или правой кнопкой мыши.


Добавлено:
Сообщение автоматически объединено:

Примерно так получилось:

Код:
while 1
		Local $Msg = TrayGetMsg()
		if $Msg = $TRAY_EVENT_PRIMARYDOWN Or $Msg = $TRAY_EVENT_SECONDARYDOWN Then
			Opt("TrayOnEventMode", 1)	
			Say ("Сравнение прервано", 2000)
			Return
		EndIf
		$konRaw = ClipGet()
		if StringLen($konRaw) > 10 Then ExitLoop
		sleep (100)
	WEnd


но почему-то надпись "сравнение прервано" как-то тормознуто появляется. Наверное, потому что Windows 7.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Примерно так:

Код:
while 1
        Local $Msg = TrayGetMsg()
        if $Msg = $TRAY_EVENT_PRIMARYDOWN Or $Msg = $TRAY_EVENT_SECONDARYDOWN Then
            Opt("TrayOnEventMode", 1)   
            Say ("Сравнение прервано", 2000)
            Return
        EndIf
        $konRaw = ClipGet()
        if StringLen($konRaw) > 10 Then ExitLoop
        sleep (100)
    WEnd

Func Say($Say, $ShowTime=1500)
	TrayTip ("", $Say, 1)
	sleep($ShowTime)
	TrayTip("", "", 0) 
EndFunc
 

Sp01LeR

Знающий
Сообщения
45
Репутация
12
Код:
Opt("GUIOnEventMode", 1)
Opt("TrayOnEventMode", 1)
Opt("SendAttachMode", 1)
Opt("TrayMenuMode", 3)
Opt("TrayAutoPause", 0)
Opt("WinWaitDelay", 0)
Opt("WinTextMatchMode", 2)
Opt("WinSearchChildren", 1)
Opt("SendKeyDownDelay", 50)

Global $var_RunFunc = 0
AdlibRegister("AdLibFunc")

TraySetClick (8)
TrayCreateItem("Наша функция")
TrayItemSetOnEvent(-1, "fRun")
TrayCreateItem("Выход")
TrayItemSetOnEvent(-1, "_Exit")

;~ Основной цикл
While True
    Sleep(50)
Wend

Func fRun()
	$var_RunFunc = 1
EndFunc

Func AdLibFunc()
	If $var_RunFunc Then
		AdlibUnRegister("AdLibFunc")
		MyFunc()
	EndIf
EndFunc

;~ Выйти
Func _Exit()
    Exit
EndFunc


Func MyFunc()
    Local $konRaw
    ClipPut("")

    TrayTip ("", "Скопируйте информацию в буфер обмена", 1)
    sleep(2000)
    TrayTip ("", "", 1)

    while 1
        $konRaw = ClipGet()
        if StringLen($konRaw) > 10 Then ExitLoop
        sleep (100)

;~      В этом месте нужно сделать так, чтобы можно было
;~      закрыть программу мышкой через кнопку TrayCreateItem("Выход")

    WEnd

    ConsoleWrite("Помещено в буфер:" & @CRLF & $konRaw)

EndFunc


но теперь еще нужно придумать, как остановить цикл, если выход не требуется ;D
 
Верх