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

No nie rozumiem.


Rekomendowane odpowiedzi

Opublikowano

Mam pytanko, próbuje zrobić skrypcik, który otwierały by kilka programów.

Chcę aby odpalał jeden po czym, żeby wyskakiwało okienko MsgBox i były do wyboru 2 programy.

Automatyczne logowanie itd.

Kod

Local $exeLocation = "X:\YXZ"
Local $exeLocation1 = Run("X:\yzx", "", @SW_SHOWMINIMIZED)
Local $exeLocation2 = Run("X:\xyz", "", @SW_SHOWMINIMIZED)
#include <MsgBoxConstants.au3>
RunWait($exeLocation)
Sleep(5000)

$kappa = 0
$kappa = MsgBox(4, "program1 czy program2?", "program1 to YES, NO to program2")

If $kappa = 6 Then
   Run($exeLocation1,  @SW_SHOWMINIMIZED)

ElseIf $kappa = 7 Then
   Run($exeLocation2)
EndIf

MouseMove(797, 71)
MouseClick("Left")
Sleep(8000)
#include <AutoItConstants.au3>
MouseClickDrag($MOUSE_CLICK_LEFT, 272, 349, 487, 350)
Send("Login")
MouseMove(277, 417)
MouseClick("Left")
Send("Hasło")
MouseMove(523, 455)
MouseClick("Left")
Sleep(5000)
MouseMove(796, 64)
MouseClick("Left")
MouseMove(858, 186)
MouseClick("Left")
MouseMove(1053, 226)
MouseClick("Left")
MouseMove(901, 739)
MouseClick("Left")

giphy.gif

Opublikowano

To sobie napisz logowania do każdego programu bo nikt nie będzie zgadywał co ty uruchamiasz i jak się zalogować. 

 

Masz jeszcze masę pomocnych poleceń z autoit by na[isać ProcessWaitWinActiveWinExistsWinWaitActiveWinWaitCloseWinWaitDelay (Option)WinWaitNotActive

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Wszystko działa tylko, że po kliknięciu YES/NO nic się nie włącza. Reszta działa bez problemu.

Sytuacja wygląda tak, że program który chce odpalić potrzebuje uprawnienia na wprowadzaniu zmian na tym urządzeniu. Może to być przyczyną nie otwierania się pliku?

Nawet takie coś nie działa z tym programem.

Local $exeLocation = "X:\XYZ\xyz.exe"
Run($exeLocation)

giphy.gif

Opublikowano

Jeszcze jedno pytanko co do funkcji PixelSearch, co zrobić aby funkcja ta czekała na ten kolor? W sensie, żeby nie robił nic dopóki nie znajdzie się tam ten kolor?

giphy.gif

Opublikowano

Super, jest możliwości utworzenia czegoś podobnego MsgBox tylko z polem tekstu do którego można wpisać i w dalszym etapie bota, żeby wpisywał to co zostało do niego wpisane???

giphy.gif

Opublikowano

A z tym Run da się coś zrobić? Program się nie włącza mimo, że jest wszystko dobrze napisane, gdy włączam manualnie prosi mnie o uprawnienia na wprowadzanie zmian na komputerze. Może być to przyczyną? Jeśli tak to jak jej zaradzić?

giphy.gif

Opublikowano
Local $exeLocation1 = Run("X:\yzx", "", @SW_SHOWMINIMIZED)
Local $exeLocation2 = Run("X:\xyz", "", @SW_SHOWMINIMIZED)

te linijki już ci odpalają te programy. zastąp te linijki samą deklaracją lokacji:

$exeLocation1 = "X:\yzx"
$exeLocation2 = "X:\xyz"

natomiast wywołanie programów daj w warunku czyli powinno tam być tak:

If $kappa = 6 Then
   Run($exeLocation1)

ElseIf $kappa = 7 Then
   Run($exeLocation2)
EndIf
Opublikowano

Tak było tylko, programy które potrzebowały jakichś permissi nie odpalały się za pomocą Run, zmieniłem na ShellExecute, usunąłem potwierdzenia i działa.

giphy.gif

  • 2 tygodnie później...
Opublikowano

Mam pytanie, jest możliwość aby w Imputboxie ustawić aby default był ten co był ostatnio wpisany? W sensie, że np. poprzednio wpisałem "table" i teraz chce aby w default był ten "table"?

giphy.gif

Opublikowano

Jak zapiszesz ten tekst poza programem to tak.

Global $fpath = @ScriptDir & "\a.txt"

$var = ""
If FileExists($fpath) Then $var = FileReadLine($fpath, 1)
FileWrite(FileOpen($fpath, 2), InputBox("InputBox", "InputBox", $var))

 

 

Opublikowano

Trochę to dziwaczne, ale da się to zrobić.

OnAutoItExitRegister ( "SaveScript" )  ;rejestracja funkcji uruchamianej przy zamknięci skryptu

Global $sInputText, $aArray = FileReadToArray(@ScriptFullPath) ;wczytanie do skryptu jego własnego kodu
Global $sPrefix = "::: "  ;zdefiniowany prefiks
Local $sText

$sPrefix = ";" & $sPrefix ;przed prefiksem dodajemy średnik, aby był to komentarz
$sLast = $aArray[UBound($aArray)-1]  ;ostatni wiersz kodu
If StringLeft($sLast, 5) = $sPrefix Then $sText = StringTrimLeft($sLast, 5) ;jeżeli jest komentarzem rozpoczynającym się prefiksem
$sInputText = InputBox("Test", "Da się zrobić", $sText)  ;to część komentarza po prefiksie, wstawiana jako tekst początkowy w polu INPUTa

;tu może być dalsza część skryptu

;funkcja uruchamiana podczas zamykania skryptu
Func SaveScript()
   If Not (StringLeft($aArray[UBound($aArray)-1], 5) = $sPrefix) Then ReDim $aArray[UBound($aArray)+1]
   $aArray[UBound($aArray)-1] = $sPrefix & $sInputText 
   $hScript = FileOpen(@ScriptFullPath, 2)  ;otwarcie pliku z kodem skryptu z opcją nadpisywania
   For $sLine In $aArray                      ;zapisywanie w pętli z tablicy zmodyfikowanego kodu skryptu
      FileWriteLine($hScript, $sLine)
   Next
   FileClose($hScript)  ;zamknięcie pliku z kodem skryptu
EndFunc

Wartość z INPUT'a jest zapisywana w ostatnim wierszu kodu jako komentarz po zadeklarowanym prefiksie.

Tego typu technika nazywa się programowaniem refleksyjnym, co oznacza, że skrypt sam modyfikuje swój własny kod.

Niestety mechanizm ten działa tylko ze skryptem nieskompilowanym.

Opublikowano

Nie wiem jak wygląda twój cały skrypt, ale najprościej będzie zdefiniować gorący klawisz (skrót klawiszowy), którego wciśnięcie spowoduje zamknięcie skryptu.

Jeżeli działanie skryptu podtrzymywane jest przez pętlę bez końca, to jest to w zasadzie jedyny sposób.

Schemat skryptu będzie wyglądał następująco:

;rejestracja funkcji wywoływanej za pomocą skrótu klawiszowego
HotKeySet("^{END}", "koniec") ;zakończenie skryptu po wciśnięciu klawiszy Ctrl + END


;pętla podtrzymująca działanie skryptu
Do
;coś tam, coś tam
Until False


;definicja funkcji kończącej skrypt po naciśnięciu klawiszy Ctrl + END
Func koniec()
   MsgBox(64,"TEST", "Koniec działania skryptu!", 2)
   Exit
EndFunc

Po jednoczesnym wciśnięciu klawiszów Ctrl i END skrypt zakończy działanie po wyświetleniu stosownego komunikatu.

Opublikowano

Nie wiem jak wygląda twój cały skrypt, ale najprościej będzie zdefiniować gorący klawisz (skrót klawiszowy), którego wciśnięcie spowoduje zamknięcie skryptu.

Jeżeli działanie skryptu podtrzymywane jest przez pętlę bez końca, to jest to w zasadzie jedyny sposób.

Schemat skryptu będzie wyglądał następująco:

;rejestracja funkcji wywoływanej za pomocą skrótu klawiszowego
HotKeySet("^{END}", "koniec") ;zakończenie skryptu po wciśnięciu klawiszy Ctrl + END


;pętla podtrzymująca działanie skryptu
Do
;coś tam, coś tam
Until False


;definicja funkcji kończącej skrypt po naciśnięciu klawiszy Ctrl + END
Func koniec()
   MsgBox(64,"TEST", "Koniec działania skryptu!", 2)
   Exit
EndFunc

Po jednoczesnym wciśnięciu klawiszów Ctrl i END skrypt zakończy działanie po wyświetleniu stosownego komunikatu.

Czyli co mam wpisać między Do i Until false?

giphy.gif

Opublikowano

Nie mam pojęcia. Napisałeś, że skrypt ci się nie zamyka. W odpowiedzi przedstawiłem sposób, w  jak można zamknąć skrypt pracujący w nieskończonej pętli, i który się sam nie zamknie.

Co i gdzie masz wstawić można by określić po zapoznaniu z kodem skryptu, który ci się nie zamyka. A ty takiego kodu nie podałeś.

Dlatego w tej chwili nie jestem w stanie bardziej ci pomóc, niż zrobiłem to do tej pory. Po prostu brak danych!

 

Pozdrawiam.

Opublikowano

Działa. Czy jest dopuszczalne takie coś? Btw. jak zapisany kolor jest dopuszczalny? Używam Instant Eyedropper'a i jest tam opcja wyboru Hex, HTML itd. Które będzie działać i jak zapisać? Czy taki zapisa 0xFFFFFF jest prawidłowy? Bo coś mi nie działało ;c To jest tylko wycinek.

Local $c = 5
   While $c = 5
	  Local $aCoord = PixelSearch(931, 475, 931, 475, 0x12335B)
	  If Not @ Then
	  MouseMove(741, 474)
	  MouseClick("Left")
	  ;W tym momencie coś się psuje
	 Local $bCoord = PixelSearch(531, 163, 531, 163, 0x010101)
	  If Not @ Then
		 $c = $c + 1
	  EndIf
	  EndIf
   WEnd

Local $d = 0
While $d = 0
	  Local $bCoord = PixelSearch(531, 163, 531, 163, 0x010101)
	  If Not @ Then
	  MouseMove(510, 765)
	  MouseClick("Left")
	  Send("Hi")
	  Sleep(325)
	  Send("{ENTER}")
	  Send("{ENTER}")
	  Send("{ENTER}")
	  MouseClick("left", 1018, 164)
	  #include <AutoItConstants.au3>
	  MouseClickDrag($MOUSE_CLICK_LEFT, 1018, 164, 1152, 161)
	  Send("Hello")
	  Sleep(500)
	  MouseMove(484, 240)
	  MouseClick("Left")
	  MouseMove(1077, 548)
	  MouseClick("Left")
	  Sleep(500)
   EndIf
   Local $dCoord = PixelSearch(1138, 553, 1138, 553, 0x777777)
   If Not @ Then
	  $d = $d + 1
   EndIf
   WEnd

giphy.gif

Opublikowano

Patrzę na twój kod i pewnych rzeczy nie rozumiem:

1. Po co używasz funkcji PixelSearch  kiedy obszar, w którym szukasz koloru jest pojedynczym pikselem. Trzeba użyć funkcji PixelGetColor.

zamiast

Local $aCoord = PixelSearch(931, 475, 931, 475, 0x12335B)
         If Not @ Then

powinno być:

	 If PixelGetColor(931, 475)=0x12335B Then

Będzie prościj i szybciej.

 

2. Czemu #include <AutoItConstants.au3> znajduje się wewnątrz drugiej pętli, bibliotekę (a właściwie plik definicji stałych) wczytuje się raz, a nie wielokrotnie przy każdym obejściu pętli.

Ten wiersz powinien znaleźć się na początku skryptu.

 

3. Nie bardzo rozumiem po co taka komplikacja:

Local $c = 5
   While $c = 5
.
.
.
.
     $c = $c + 1

Niezależnie od tego czy $c=5 czy $c=1000 i tak po pierwszym $c = $c + 1 sterowanie opuści pętlę.

A tak na marginesie zamiast $c = $c + 1 można zgrabnie napisać $c += 1.

 

4. Na koniec najpoważniejszy błąd, którego jak widzę sam miałeś świadomość, tylko nie wiedziałeś na czym polega:

	  Local $aCoord = PixelSearch(931, 475, 931, 475, 0x12335B)
	  If Not @ Then
	  MouseMove(741, 474)
	  MouseClick("Left")
	  ;W tym momencie coś się psuje
	 Local $bCoord = PixelSearch(531, 163, 531, 163, 0x010101)

W pierwszym PixelSearch sprawdzasz czy punkt ma kolor o kodzie 0x12335B, jeżeli ma to sprawdzasz w drugim PixelSearch, czy ma kolor 0x010101.

A przecież jeżeli piksel ma pierwszy kolor, to nie może mieć jednocześnie tego drugiego koloru. I tak nieświadomie zaserwowałeś sobie nieskończoną pętlę, której skrypt nigdy nie opuści i samodzielnie nie zakończy swojego działania.

Pod względem formalnym twój skrypt powinien wyglądać tak:

#include <AutoItConstants.au3>

While True
   If PixelGetColor(931, 475)=0x12335B Then
	  MouseMove(741, 474)
	  MouseClick("Left")
	  If PixelGetColor(931, 475)=0x12335B Then  ;tu jest na pewno błąd
	     ExitLoop
	  EndIf
   EndIf
WEnd


While True
   If PixelGetColor(531, 163)=0x010101 Then
      MouseMove(510, 765)
      MouseClick("Left")
      Send("Hi")
      Sleep(325)
      Send("{ENTER}")
      Send("{ENTER}")
      Send("{ENTER}")
      MouseClick("left", 1018, 164)
      MouseClickDrag($MOUSE_CLICK_LEFT, 1018, 164, 1152, 161)
      Send("Hello")
      Sleep(500)
      MouseMove(484, 240)
      MouseClick("Left")
      MouseMove(1077, 548)
      MouseClick("Left")
      Sleep(500)
   EndIf
   If PixelGetColor(1138, 553)=0x777777 Then ExitLoop
WEnd

Niestety skrypt zawiera błąd (ta nieszczęsna nieskończona pętla), którego nie wiem jak poprawić. Nie z powodu braku znajomości AutoIt'a, lecz po prostu nie wiem co chciałeś osiągnąć.

Opublikowano

To w takim zrobić aby cześć pierwsza wyszła z pętli tylko i wyłącznie gdy zostanie spełniony dany warunek czyli ten drugi PixelGetColor?

While True
   If PixelGetColor(531, 163)=0x010101 Then ;Powiedzmy, że jest to pierwsza część 
      MouseMove(510, 765)
      MouseClick("Left")
      Send("Hi")
      Sleep(325)
      Send("{ENTER}")
      Send("{ENTER}")
      Send("{ENTER}")
      MouseClick("left", 1018, 164)
      MouseClickDrag($MOUSE_CLICK_LEFT, 1018, 164, 1152, 161)
      Send("Hello")
      Sleep(500)
      MouseMove(484, 240)
      MouseClick("Left")
      MouseMove(1077, 548)
      MouseClick("Left")
      Sleep(500)
   EndIf
   If PixelGetColor(1138, 553)=0x777777 Then ExitLoop ; A to druga
WEnd

giphy.gif

Opublikowano

Przeciez tak wlasnie jest. :>

Wyjdzie z petli tylko i wylacznie wtedy, gdy spelniony zostanie warunek:

If PixelGetColor(1138, 553)=0x777777 Then ExitLoop

 

 

Opublikowano

If <warunek> Then ; główny warunek czyli pierwszy
<instrukcja wykonywana jeśli spełniony zostanie warunek główny>
...

 

Elseif <inny warunek> Then ; dodatkowy warunek czyli drugi
<instrukcja wykonywana jeśli spełniony zostanie drugi warunek, a pierwszy nie>
...

 

Else
<instrukcja wykonywana jeśli nie zostanie spełniony żaden z warunków>
...

 

Endif

 

Proste co ?  Dwa warunki i trzy możliwości do wykorzystania. 

 

I jeszcze małe bezsensy :  MouseClick ma w swojej funkcji   MouseMove to po co pisać go jeszcze  przed ??

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...