Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pętla Do Until i dwa warunki


Rekomendowane odpowiedzi

Opublikowano

Witam, czy w pętli Do ... Until można zastosować dwa warunki? Już tłumaczę na przykładzie.

 

Func ZWZP()

	Do
		Local $zwzp, $szablontaran, $napad, $wyslijatak
		$zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 90);==> SZABLON ZWZP
		If $zwzp = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(1000)

		$szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90);==> SZABLON JAKIM WOJSKIEM
		If $szablontaran  = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		If $napad = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		$bl = _ImageSearch(@ScriptDir  & "\obraz\brakjednostek.bmp", 1, $x, $y, 100)
		If $wyslijatak = 1 Then
			MouseClick("left", $x, $y, 1, 10)
		Sleep(1000)
		If  $bl = 1 Then ExitLoop
		EndIf
		Sleep(500)
	Until co dalej ??
EndFunc

 i chciałbym ustawić to tak, że dopóki widzi $zwzp, a nie wyskoczyło $bl to wykonuje pętle cały czas. Jeżeli nie widzi obrazka $zwzp - przerywa pętle oraz gdy kliknie w obrazek $zwzp a po nim wyskoczy $bl to też ją przerwie. Jest ktoś mi wstanie pomoc? Może idzie zastosować inna pętle bądź inaczej ją jakoś przerobić?

Na początku myślałem, że wystarczy dodać 

		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		$bl = _ImageSearch(@ScriptDir  & "\obraz\brakjednostek.bmp", 1, $x, $y, 100)
		If $wyslijatak = 1 Then
			MouseClick("left", $x, $y, 1, 10)
		Sleep(1000)
		If  $bl = 1 Then ExitLoop
		EndIf
		Sleep(500)
	Until $zwzp = 0

 Ale pętla nie zostaje przerwana.  Jak tylko zobaczy $zwzp to dalej chcę ją wykonywać;/

Opublikowano

Zgodnie z twoim opisem powinno to wyglądać tak:

Func ZWZP()

	Do
		Local $zwzp, $szablontaran, $napad, $wyslijatak
		$zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 90);==> SZABLON ZWZP
		If $zwzp = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(1000)

		$szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90);==> SZABLON JAKIM WOJSKIEM
		If $szablontaran  = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		If $napad = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		$bl = _ImageSearch(@ScriptDir  & "\obraz\brakjednostek.bmp", 1, $x, $y, 100)
		If $wyslijatak = 1 Then 
 			MouseClick("left", $x, $y, 1, 10)
			Sleep(1000)
 		Endif
		Sleep(500)
	Until ($zwzp = False) Or ($zwzp And $bl)
EndFunc

 

Opublikowano

Dziękuję za odpowiedz. 

Jednak to jeszcze nie to co chciałem osiągnąć gdyż pętla po wyskoczeniu $zwzp i $bl nadal działa, nie przerywa się ;/ 

Nadal będę szukał pomysłu na to. Może wreszcie dojdę do tego.

Opublikowano

Czy obrazki ZWZP.bmp i brakjednostek.bmp są na ekranie jednocześnie?

Jeżeli po pojawieniu jednego znika drugi to taka pętla jest niewłaściwa i trzeba ją przebudować.

Opublikowano

Jest to dokładnie tak:

Przyjmijmy, że jest obrazek $zwzp(znika), kolejny obrazek $szablontaran(znika), kolejny obrazek $napad(znika) I TERAZ wyskakuje $bl. Czyli w skrypcie wyskakuje dokładnie : (zaznaczam niżej)

Func ZWZP()

	Do
		Local $zwzp, $szablontaran, $napad, $wyslijatak
		$zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 90);==> SZABLON ZWZP
		If $zwzp = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(1000)

		$szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90);==> SZABLON JAKIM WOJSKIEM
		If $szablontaran  = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		If $napad = 1 Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)
 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX W tym momencie,
		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		$bl = _ImageSearch(@ScriptDir  & "\obraz\brakjednostek.bmp", 1, $x, $y, 100)
		If $wyslijatak = 1 Then 
 			MouseClick("left", $x, $y, 1, 10)
			Sleep(1000)
 		Endif
		Sleep(500)
	Until ($zwzp = False) Or ($zwzp And $bl)
EndFunc

 

 

Po edycji probowałem coś takiego:

 

 

Func ZWZP()

    Do
        Local $zwzp, $szablontaran, $napad, $wyslijatak, $bl
        $zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 90);==> SZABLON ZWZP
        If $zwzp = 1 Then MouseClick("left", $x, $y, 1, 10)
        sleep(1000)

        $szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90);==> SZABLON JAKIM WOJSKIEM
        If $szablontaran  = 1 Then MouseClick("left", $x, $y, 1, 10)
        sleep(300)


        $bl = _ImageSearch(@ScriptDir  & "\obraz\zwzp\brakjednostek.bmp", 1, $x, $y, 100)
        $napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
        If $napad = 1 Then
            MouseClick("left", $x, $y, 1, 10)
        sleep(1000)
        If $bl = 1 Then ExitLoop
        Sleep(1000)
        EndIf

        $wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
        If $wyslijatak = 1 Then MouseClick("left", $x, $y, 1, 10)
            Sleep(1400)
    Until $zwzp = 0
EndFunc

Opublikowano

Jedyne co może być powodem, że nie przerywa pętli, to nie znalezienie brakjednostek.bmp.

Func ZWZP()

	Do
		Local $zwzp, $szablontaran, $napad, $wyslijatak
		$zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 90);==> SZABLON ZWZP
		If $zwzp Then MouseClick("left", $x, $y, 1, 10)
		sleep(1000)

		$szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90);==> SZABLON JAKIM WOJSKIEM
		If $szablontaran Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		If $napad Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)

		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90);==> SZABLON NAPAD
		$bl = _ImageSearch(@ScriptDir  & "\obraz\brakjednostek.bmp", 1, $x, $y, 100)
		If $bl Then MsgBox(64,"", "Znaleziono")  ;***********************instrukcja testowa*********************************
		If $wyslijatak Then 
 			MouseClick("left", $x, $y, 1, 10)
			Sleep(1000)
 		Endif
		Sleep(500)
	Until ($zwzp = False) Or ($zwzp And $bl)
EndFunc

Wstaw testową instrukcję i zobacz czy ci to w ogól znajduje ten obrazek.

Opublikowano

Dobra udało się to naprawić wspólnymi siłami. Pierw w złym miejscu dodałem IF. Dodałem go za $wyslijatak, a on powinien być po $napad. Jednak po zmianie tego nadal coś nie działało. Po zmianach dopiero zaczeło działać w takiej postaci:

Func ZWZP()

    Do
        Local $zwzp, $szablontaran, $napad, $wyslijatak, $bl, $okno

        $zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 100)
        If $zwzp Then MouseClick("left", $x, $y, 1, 10)
        sleep(1000)

        $szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90)
        If $szablontaran Then MouseClick("left", $x, $y, 1, 10)
        sleep(300)


        $napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90)
        If $napad Then MouseClick("left", $x, $y, 1, 10)
        Sleep(300)
        $bl = _ImageSearch(@ScriptDir  & "\obraz\zwzp\bj.bmp", 1, $x, $y, 90)
        If $bl Then
            ExitLoop
        EndIf

        $wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90)
        If $wyslijatak Then MouseClick("left", $x, $y, 1, 10)
            Sleep(1000)

    Until ($zwzp = False) Or ($zwzp And $bl)

EndFunc

 

 

wasta dziękuje za zainteresowanie wątkiem, ale mam jeszcze jedno drobne pytanie. Na końcu dodałem jeszcze Ifa, który zamknie mi po prostu te okno po wyskoczeniu obrazka. Czy idzie dopisac, żeby mi wyskoczyło okienko, które mnie powiadomi, że skrypt został zakończony?  Naszkicuje o co mi dokładnie chodzi.

 

Func ZWZP()

	Do
		Local $zwzp, $szablontaran, $napad, $wyslijatak, $bl, $okno

		$zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 100)
		If $zwzp Then MouseClick("left", $x, $y, 1, 10)
		sleep(1000)

		$szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90)
		If $szablontaran Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)


		$napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90)
		If $napad Then MouseClick("left", $x, $y, 1, 10)
		Sleep(300)
		$bl = _ImageSearch(@ScriptDir  & "\obraz\zwzp\bj.bmp", 1, $x, $y, 90)
		If $bl Then
			ExitLoop
		EndIf

		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90)
		If $wyslijatak Then MouseClick("left", $x, $y, 1, 10)
			Sleep(1000)

	Until ($zwzp = False) Or ($zwzp And $bl)

	    $okno = _ImageSearch(@ScriptDir & "\obraz\zwzp\zamknijokno.bmp", 1, $x, $y, 90)
		If $okno Then MouseClick("left", $x, $y, 1, 10)	 MsgBox(64,"", "Wysłane wszystkie wojska") 

EndFunc

idzie jakoś jednym Ifem wywołać dwa żądania ?

Opublikowano

Nie jestem pewien czy o to ci chodzi, ale poprawnie pod względem formalnym będzie tak:

Func ZWZP()

	Do
		Local $zwzp, $szablontaran, $napad, $wyslijatak, $bl, $okno

		$zwzp = _ImageSearchArea(@ScriptDir  & "\obraz\zwzp\ZWZP.bmp", 1, 1347, 690, 1384, 811, $x, $y, 100)
		If $zwzp Then MouseClick("left", $x, $y, 1, 10)
		sleep(1000)

		$szablontaran = _ImageSearch(@ScriptDir  & "\obraz\zwzp\mur1-2z.bmp", 1, $x, $y, 90)
		If $szablontaran Then MouseClick("left", $x, $y, 1, 10)
		sleep(300)


		$napad = _ImageSearch(@ScriptDir  & "\obraz\zwzp\napad.bmp", 1, $x, $y, 90)
		If $napad Then MouseClick("left", $x, $y, 1, 10)
		Sleep(300)
		
		$bl = _ImageSearch(@ScriptDir  & "\obraz\zwzp\bj.bmp", 1, $x, $y, 90)
		If $bl Then ExitLoop

		$wyslijatak = _ImageSearch(@ScriptDir  & "\obraz\zwzp\wyslijatak.bmp", 1, $x, $y, 90)
		If $wyslijatak Then MouseClick("left", $x, $y, 1, 10)
		Sleep(1000)

	Until ($zwzp = False) Or ($zwzp And $bl)

    $okno = _ImageSearch(@ScriptDir & "\obraz\zwzp\zamknijokno.bmp", 1, $x, $y, 90)
    If $okno Then 
	MouseClick("left", $x, $y, 1, 10)
	MsgBox(64,"", "Wysłane wszystkie wojska")
    EndIf
EndFunc

 

Opublikowano

Jak ustawić, żeby w GUI COMBO dopiero po kliknięciu myszka zaczynało mi się wykonywać polecenie? Teraz jest tak, że jak najadę myszka to od razu zaczyna on działać ;/ 

 

$Form1 = GUICreate("Form1", 202, 156, 192, 124)
$Label1 = GUICtrlCreateLabel("BOT PLEMIONA v1.0", 0, 8, 204, 17, $SS_CENTER)
$Button1 = GUICtrlCreateButton("Farmienie", 25, 24, 75, 25)
$Button2 = GUICtrlCreateButton("Wioski", 26, 48, 73, 25)
$Button3 = GUICtrlCreateButton("Pausa", 104, 24, 75, 25)
$Button4 = GUICtrlCreateButton("Koniec", 104, 48, 75, 25)
$hCombo=GUICtrlCreateCombo("Ilosc wiosek", 104, 100, 85, 21, $CBS_DROPDOWNLIST)  ; pierwsza pozycja listy
GUICtrlSetData(-1, "Wioska 2|Wioska 3|Wioska 4|Wioska 5", "Ilosc wiosek") ;pozostale pozycje oraz ustalenie pozycji domyslnej


GUISetState(@SW_SHOW)


GUISetState()
;==========================================
While 1
   $msg = GUIGetMsg()
   Switch GUICtrlRead($hCombo)
      Case "Wioska 2"
				Wioska_JEDEN()
				Wioska_DWA()
      Case "Wioska 3"
                Wioska_JEDEN()
			    Wioska_DWA()
				Wioska_TRZY()
      Case "Wioska 4"
				Wioska_JEDEN()
			    Wioska_DWA()
				Wioska_TRZY()
				Wioska_CZTERY()
      Case "Wioska 5"
				Wioska_JEDEN()
			    Wioska_DWA()
				Wioska_TRZY()
				Wioska_CZTERY()
				Wioska_PIEC()
   EndSwitch
WEnd

======================================================================================================

I pytanie drugie: 

Jak zaznaczę np: Wioska 2 i będę chciał zatrzymać skrypt to jak ustawić, żeby udało się wznowić skrypt, bez potrzeby jego restartowania.

Do tej pory mam tak, że zatrzymuje skrypt poprzez:

HotKeySet("{F2}", "Pause")
Func Pause()
      While 1
         Sleep(50)
      WEnd
 EndFunc

============================================================================================================================

 

ktoś coś?

Czy ktoś może posiada inny pomysł?

Opublikowano

Jeżeli chodzi o pytanie pierwsze, to można zrobić jak w poniższym przykładzie:

#include <GUIConstants.au3>
HotKeySet("{ESC}", "end")

$hForm1 = GUICreate("Form1", 202, 156, 192, 124)
$hLabel1 = GUICtrlCreateLabel("BOT PLEMIONA v1.0", 0, 8, 204, 17, 1)
$hButton1 = GUICtrlCreateButton("Farmienie", 25, 24, 75, 25)
$hButton2 = GUICtrlCreateButton("Wioski", 26, 48, 73, 25)
$hButton3 = GUICtrlCreateButton("Pausa", 104, 24, 75, 25)
$hButton4 = GUICtrlCreateButton("Koniec", 104, 48, 75, 25)
$hCombo=GUICtrlCreateCombo("Ilosc wiosek", 104, 100, 85, 21, $CBS_DROPDOWNLIST)  ; pierwsza pozycja listy
GUICtrlSetData(-1, "Wioska 2|Wioska 3|Wioska 4|Wioska 5", "Ilosc wiosek") ;pozostale pozycje oraz ustalenie pozycji domyslnej

GUISetState()
;==========================================
While 1
   $msg = GUIGetMsg()
   Select
      Case GUICtrlRead($hCombo)="Wioska 2" And $msg=$hCombo
		MsgBox(0,"","Wioska 2",1)
      Case GUICtrlRead($hCombo)="Wioska 3" And $msg=$hCombo
		MsgBox(0,"","Wioska 3",1)
      Case GUICtrlRead($hCombo)="Wioska 4" And $msg=$hCombo
		MsgBox(0,"","Wioska 4",1)
      Case GUICtrlRead($hCombo)="Wioska 5" And $msg=$hCombo
		MsgBox(0,"","Wioska 5",1)
   EndSelect
WEnd

;-----------------------------------------------
Func end()
	Exit
EndFunc

Jeżeli chodzi o drugie pytanie, to możesz użyć funkcji z napisanego przeze mnie UDF'a -  HotKeySetEx.au3. W pakiecie są także przykłady użycia poszczególnych funkcji.

Możesz to zrobic np. tak jak w przykładzie 2, 3 lub 4 w zależności od potrzeb.

Np. tak:

#include<HotKeySetEx.au3>

_HotKeyStop("{F8}", "{F9}", True) ;rejestracja klawiszy, F8 - zatrzymanie, F9 - ponowne uruchomienie
_HotKeyExit("{ESC}", True)        ;rejestracja klawisza kończącego skrypt (ESC)

Local $i = 0

While True
	 $i += 1
	 ConsoleWrite("Obieg pętli: " & $i & @CRLF)
	 Sleep(1000)
WEnd

 

HotKeySetEx.zip

Opublikowano
Cytat

Widzę, że używasz mojego podręcznika na Wikibooks. Bardzo mi miło, ze jest użyteczny.

To jest najlepsze źródło wiedzy jakie istnieje. Bardzo często tam zaglądam. Podręcznik jest po prostu super.  Dziękuje za UDF'a na pewno wykorzystam go w swoim projekcie. Wszystko działa tak jak chciałem, teraz pozostaje mi popisać dalsze funkcje na przyciski. Jeszcze tak przy okazji idąc trochę na łatwiznę. Jeszcze sam nie próbowałem tego zrobić ale mam to dopiero w zarysie. Jest możliwość, żeby odpalać funkcję o określonej godzinie ?

Opublikowano

Jeszcze co do odpalania funkcji o określonej godzinie nie doszedłem jak to zrobić. Moje oczekiwania są takie, że odpalam funkcje. Ona sobie działa robi to co jest ustawione. Ale np o godzinie załóżmy  ustawiam na 19:00, żeby przerwał mi to co robi do tej pory i odpalił inna funkcję. Czyli np;

Wykonuje ta funkcje. Po wcześniejszym ustaleniu godziny czyli 19:00 przerywa tą funkcje

      Case "Wioska 5"
				Wioska_JEDEN()
			    Wioska_DWA()
				Wioska_TRZY()
				Wioska_CZTERY()
				Wioska_PIEC()

i załącza np: 

      Case "Wioska 3"
                Wioska_JEDEN()
			    Wioska_DWA()
				Wioska_TRZY()

Nad tym cały czas myślę jak to zrobić, ale na chwile obecna nie znalazłem żadnego rozwiązania. 

 

Problem napotkany kolejny. Jak aktywować okno, żeby było ono w 100% aktywne? Używam przeglądarki CHROME. Użyłem komendy  WinActivate("[CLASS:Chrome_WidgetWin_1]"). Jak mam zakryte jakimiś innymi oknami to okno od CHROME mi się pojawia, ale niestety nie jest że tak powiem aktywne w 100%. Żeby zostało aktywne muszę jeszcze kliknąć na nie. Jest jakaś dodatkowa komenda?

 

Opublikowano

Jeden z możliwych sposobów na uruchomienie innej sekwencji skryptu po zadanej godzinie, z zastosowaniem funkcji adlib:

HotKeySet("{ESC}", "end")
Func end()
	Exit
EndFunc
;--------------------------------------------------------

AdlibRegister ("Adlib", 1000)   ;rejestrowanie funkcji adlib uruchamianej co 1 sekundę

Global $iTime = "0754"  ;czas przełączenia w formacie HHMM
Global $fWSK = True

While True
	If $fWSK Then
		Wioska_JEDEN("", "111111")
		Wioska_DWA("", "222222")
		Wioska_TRZY("", "333333")
		Wioska_CZTERY("", "444444")
		Wioska_PIEC("", "555555")
	Else
		Wioska_JEDEN("ALTERNATYWA", "111111")
		Wioska_DWA("ALTERNATYWA", "222222")
		Wioska_TRZY("ALTERNATYWA", "333333")
	EndIf
WEnd

;----------------------------------------------------------------------------------
Func Adlib()                         ;definicja funkcji adlib
	If $iTime<=@HOUR & @MIN Then      ;sprawdzenie czy jest zadana godzina i minuta
		$fWSK = False
		AdlibUnRegister("Adlib")     ;wyrejestrowanie funkcji adlib
	EndIf
EndFunc
;----------------------------------------------------------------------------------

Func Wioska_JEDEN($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_DWA($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_TRZY($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_CZTERY($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_PIEC($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Co do drugiego problemu z aktywacją okna, to nie używam Chrome, więc trudno mi to przetestować. W Firefox'ie , którego używam, w ogóle nie można aktywować okna w ten sposób. Podejrzewa, że mogą być różniste problemy dla programów nie używających standardowych kontrolek Windows, tylko swoje własne.

Jeżeli Chrome aktywuje okno częściowo, to spróbuj programowo kliknąć na nie za pomocą MouseClick(): https://pl.wikibooks.org/wiki/AutoIt/Przejmowanie_kontroli#MouseClick

Opublikowano

Wszystko ładnie działa. A jest możliwość ustawienia, żeby mi załączał funkcję np o 4 różnych godzinach? 

Opublikowano

Jeżeli niezależnie od godziny ma być takie samo przełączenie, to można to zrobić tak:

HotKeySet("{ESC}", "end")
Func end()
	Exit
EndFunc
;--------------------------------------------------------

AdlibRegister ("Adlib", 1000)   ;rejestrowanie funkcji adlib uruchamianej co 1 sekundę

Global $aTime[4] = ["0754", "1255", "1505", "2010"]  ;godziny przełączenia w formacie HHMM
Global $fWSK = True

While True
	If $fWSK Then
		Wioska_JEDEN("", "111111")
		Wioska_DWA("", "222222")
		Wioska_TRZY("", "333333")
		Wioska_CZTERY("", "444444")
		Wioska_PIEC("", "555555")
	Else
		Wioska_JEDEN("ALTERNATYWA", "111111")
		Wioska_DWA("ALTERNATYWA", "222222")
		Wioska_TRZY("ALTERNATYWA", "333333")
	EndIf
WEnd

;----------------------------------------------------------------------------------
Func Adlib()	;definicja funkcji adlib
	Local $iTimeActual = @HOUR & @MIN
	For $i=0 To UBound($aTime)-1
		If $aTime[$i]=$iTimeActual Then
			$fWSK = False
			AdlibUnRegister("Adlib")     ;wyrejestrowanie funkcji adlib
			ExitLoop
		EndIf
	Next
EndFunc
;----------------------------------------------------------------------------------

Func Wioska_JEDEN($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_DWA($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_TRZY($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_CZTERY($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_PIEC($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Jeżeli o różnych godzinach miałoby być inne działanie, to trzeba by przebudować kod.

Opublikowano

Bardzo ładnie to działa ;) dziekuje. Dużo się uczę przy Twoich odpowiedziach:) nie miałem teraz zbytnio czasu na pisanie, ale napotkałem kolejny problem. Jak Adlib wyrejestrowac? Mam to zrobione tak:

 

GUISetState()
While 1;==> GUI
   $msg = GUIGetMsg()
   Select
	Case $msg=$hButton1
				Odpalenie_strony()
	Case $msg=$hButton2
				start()
	Case $msg=$hButton3
				unreg()
	Case $msg=$hButton4
	Case $msg=$hButton5

		   Send("^{w}")

		Case GUICtrlRead($hCombo)="5 Wiosek" And $msg=$hCombo
			AdlibRegister("wiosek5")
			ToolTip("Farmienie odpalone", 0, 94,"Farmienie 5 wiosek")

		Case GUICtrlRead($hCombo)="6 Wiosek" And $msg=$hCombo
			AdlibRegister("wiosek6")
			ToolTip("Farmienie odpalone", 0, 94,"Farmienie 6 wiosek")

		Case GUICtrlRead($hCombo)="7 Wiosek" And $msg=$hCombo
			AdlibRegister("wiosek7")
			ToolTip("Farmienie odpalone", 0, 94,"Farmienie 7 wiosek")

		Case GUICtrlRead($hCombo)="8 Wiosek" And $msg=$hCombo
			AdlibRegister("wiosek8")
			ToolTip("Farmienie odpalone", 0, 94,"Farmienie 8 wiosek")

		Case GUICtrlRead($hCombo)="9 Wiosek" And $msg=$hCombo
			ToolTip("Farmienie odpalone", 0, 94,"Farmienie 9 wiosek")
			AdlibRegister("wiosek9")


;== > FUNKCJE POTRZEBNE DO ADLIB
Func wiosek5()
			Wioska_JEDEN()
			Wioska_DWA()
			Wioska_TRZY()
			Wioska_CZTERY()
			Wioska_PIEC()
EndFunc
Func wiosek6()
			Wioska_JEDEN()
			Wioska_DWA()
			Wioska_TRZY()
			Wioska_CZTERY()
			Wioska_PIEC()
			Wioska_SZESC()
EndFunc
Func wiosek7()
			Wioska_JEDEN()
			Wioska_DWA()
			Wioska_TRZY()
			Wioska_CZTERY()
			Wioska_PIEC()
			Wioska_SZESC()
			Wioska_SIEDEM()
EndFunc
Func wiosek8()
			Wioska_JEDEN()
			Wioska_DWA()
			Wioska_TRZY()
			Wioska_CZTERY()
			Wioska_PIEC()
			Wioska_SZESC()
			Wioska_SIEDEM()
			Wioska_OSIEM()
EndFunc
Func wiosek9()
			Wioska_JEDEN()
			Wioska_DWA()
			Wioska_TRZY()
			Wioska_CZTERY()
			Wioska_PIEC()
			Wioska_SZESC()
			Wioska_SIEDEM()
			Wioska_OSIEM()
			Wioska_DZIEWIEC()
EndFunc

Func unreg()
	AdlibUnRegister("wiosek5")
	AdlibUnRegister("wiosek6")
	AdlibUnRegister("wiosek7")
	AdlibUnRegister("wiosek8")
	AdlibUnRegister("wiosek9")
		ToolTip("Farmienie zatrzymane", 0, 94)
EndFunc

Problem w tym, że funkcja się nie chce wyrejestrować i nadal działa. Jak rozpisać to poprawnie?

dobra już doszedłem.. funkcje przerywa dopiero po wykonaniu całej zawartości wioska5(). 

Opublikowano

Poczytaj jeszcze raz dokładnie: https://pl.wikibooks.org/wiki/AutoIt/Dyrektywy_i_funkcje_konfiguracyjne_translatora#Funkcje_AdlibRegister_i_AdlibUnRegister

W uwadze jest napisane, że funkcja adlib powinna być prosta, gdyż w czasie jej pracy skrypt jest wstrzymywany.

A ty w na tych funkcjach chcesz oprzeć działanie całego skryptu. Musisz przebudować program tak, aby prawie wszystko działało w zasadniczej części skryptu, a nie w funkcjach adlib.

Za pomocą adlib można ustawiać np. wartości jakiś zmiennych globalnych, a zasadnicza część skryptu powinna odczytywać te wartości i odpowiednio reagować na nie.

Twoje problemy są związane prawdopodobnie z tym, że w czasie działania funkcji adlib zasadnicza część skryptu jest blokowana i wciśnięcia przycisków nie są wykrywane.

Ale nie jestem w stanie sprawdzić na 100%, bo podałeś tylko część kodu.

 

Opublikowano

Co do tamtego zrozumiałem już działanie, z czego bardzo się ciesze. 

 

Powróćmy do wcześniejszego wątku, a mianowicie do:

Dnia 5.07.2017 o 13:00, wasta napisał:

Jeżeli niezależnie od godziny ma być takie samo przełączenie, to można to zrobić tak:


HotKeySet("{ESC}", "end")
Func end()
	Exit
EndFunc
;--------------------------------------------------------

AdlibRegister ("Adlib", 1000)   ;rejestrowanie funkcji adlib uruchamianej co 1 sekundę

Global $aTime[4] = ["0754", "1255", "1505", "2010"]  ;godziny przełączenia w formacie HHMM
Global $fWSK = True

While True
	If $fWSK Then
		Wioska_JEDEN("", "111111")
		Wioska_DWA("", "222222")
		Wioska_TRZY("", "333333")
		Wioska_CZTERY("", "444444")
		Wioska_PIEC("", "555555")
	Else
		Wioska_JEDEN("ALTERNATYWA", "111111")
		Wioska_DWA("ALTERNATYWA", "222222")
		Wioska_TRZY("ALTERNATYWA", "333333")
	EndIf
WEnd

;----------------------------------------------------------------------------------
Func Adlib()	;definicja funkcji adlib
	Local $iTimeActual = @HOUR & @MIN
	For $i=0 To UBound($aTime)-1
		If $aTime[$i]=$iTimeActual Then
			$fWSK = False
			AdlibUnRegister("Adlib")     ;wyrejestrowanie funkcji adlib
			ExitLoop
		EndIf
	Next
EndFunc
;----------------------------------------------------------------------------------

Func Wioska_JEDEN($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_DWA($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_TRZY($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_CZTERY($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Func Wioska_PIEC($sTitle, $sTxt)
	MsgBox(64, $sTitle, $sTxt, 1)
EndFunc

Jeżeli o różnych godzinach miałoby być inne działanie, to trzeba by przebudować kod.

 

jak to najprościej przebudować? tak, żeby np: o godzinie 14 kliknie w jedno miejsce, o godzinie 15 w inne i o 16, żeby wcisnął F6. 

Opublikowano

Zrezygnował bym z funkcji Adlib i zrobił bym to tak:

HotKeySet("{ESC}", "end")
Func end()
	Exit
EndFunc
;--------------------------------------------------------

Dim $aTime[3] = ["1400", "1500", "1600"]  ;godziny przełączenia w formacie HHMM
Dim $fWSK[3] = [True, True, True]

While True    ;pętla główna skryptu
    $iTimeActual = @HOUR & @MIN
	For $i=0 To 2
	   If $aTime[$i]=$iTimeActual Then
	      If $fWSK[$i]=True Then
	   	     $fWSK[$i] = False
		     Action($i)
	      EndIf
       Else
	      $fWSK[$i] = True
       EndIf
    Next
	Sleep(5)
WEnd

;----------------------------------------------------------------------------------
Func Action($iPar)
   If $iPar=0 Then Action1()
   If $iPar=1 Then Action2()
   If $iPar=2 Then Action3()
EndFunc

Func Action1()
   ConsoleWrite("Działanie 1" & @LF)
EndFunc

Func Action2()
   ConsoleWrite("Działanie 2" & @LF)
EndFunc

Func Action3()
   ConsoleWrite("Działanie 3" & @LF)
EndFunc

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...