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

Napisałby mi ktoś skrypt?


Kumorex

Rekomendowane odpowiedzi

Opublikowano

Witam potrzebuję skrypt który ma wyglądać tak. Po naciśnięciu klawisza (najlepiej Q) automatycznie naciska się trzy lub cztery razy 4, a potem raz 1.


Przez przypadek napisalem nie w tym dziale. Moglby mi jakis moderator przeniesc?

Opublikowano


Local $hDLL = DllOpen("user32.dll")

 

While 1

If _IsPressed("51",$hDLL) Then

For $i=0 To 3 Step 1

Send("4")

Next

Send("1")

EndIf

WEnd

 

Opublikowano

No chyba coś nie tak. Ten skrypt nie zadziała.

Powinno być np. tak:

;rejestracja funkcji wywoływanych za pomocą gorących klawiszy
HotKeySet("{ESC}", "koniec") ;zakończenie skryptu po wciśnięciu ESC
HotKeySet("q", "akcja") ;wirtualne wciskaniw klawiszy po wciśnięciu Q

;pętla podtrzymująca działanie skryptu
Do
   Sleep(100)  ;krótka przerwa celem odciążenia procesora
Until False

;definicja funkcji wirtualnego wciskania klawiszy po naciśnięciu klawisza Q
Func akcja()
   Send("{4 4}") ;4 razy klawisz 4
   Send("1") ;raz klawisz 1
EndFunc

;definicja funkcji kończącej skrypt po naciśnięciu klawisza ESC
Func koniec()
   Exit
EndFunc
Opublikowano

Oczywiście, że próbowałem.

Zadziałać nie może z prostej przyczyny. Używasz funkcji bibliotecznej "_IsPressed", a nie wczytujesz odpowiedniej biblioteki.

Otrzymujemy więc komunikat:

Cytat
 

 

"E:\Programowanie\WASTA - programowanie\xxx.au3" (6) : ==> Unknown function name.:
If _IsPressed("51",$hDLL) Then
If ^ ERROR

Brakuje na początki:

#include<misc.au3>

 

Ale nawet po uzupełnieniu skrypt nie działa dokładnie tak jak miał.

Zamiast generować ciąg znaków "44441" generuje "q4444144441".

Czyli wysyła także klawisz uruchamiający "q", oraz sekwencję "44441" dwukrotnie.

To drugie spowodowane jest tym, że system operacyjny nie zdąży oczyścić bufora klawiatury przed drugim obiegiem pętli.

Sytuację może poprawić wstawienie sleep'a wewnątrz pętli, co i tak powinno mieć miejsce celem odciążenia procesora.

Wiersz:

Local $hDLL = DllOpen("user32.dll")

jest zupełnie zbędny, gdyż odczytywana tu wartość jest wartością domyślną drugiego parametru funkcji "_IsPressed".

Zbędne jest także użycie pętli For...Next, przecież funkcja Send umożliwia wielokrotne wysyłanie tego samego klawisza.

Ponadto tak utworzony skrypt nie można ni jak zatrzymać za pomocą mechanizmów w nim zawartych. Trzeba posiłkować się mechanizmami zewnętrznymi

systemu operacyjnego (np. sięgnąć do tray'a i tam zatrzymać skrypt), co jest rozwiązaniem nieeleganckim i należy go unikać.

Po poprawieniu twój skrypt powinien wyglądać tak:

#include<misc.au3>

While 1 
  If _IsPressed("51") Then
      For $i=0 To 3 Step 1
         Send("4")
      Next
      Send("1")
      Sleep(100)
   EndIf
   If _IsPressed("1B") Then Exit
WEnd

lub lepiej:

#include<misc.au3>
While 1
   If _IsPressed("51") Then
      Send("{4 4}")
      Send("1")
      Sleep(100)
    EndIf
    If _IsPressed("1B") Then Exit
WEnd

Ale i w tym przypadku pozostaje problem wysyłania tego "q".

Tego problemu nie ma w moim skrypcie, a poza tym nie używa on żadnej zewnętrznej biblioteki.

Polecam do poczytania: https://pl.wikibooks.org/wiki/AutoIt/Przejmowanie_kontroli#Sendi

Pozdrawiam

Opublikowano

co do <misc.au3> to rzeczywiście nie skopiowała mi się linijka z kompilatora. ok.

dalej - wysłanie q - z czego wywnioskowałeś że q ma nie zostać wysłane?

zamknięcie przez ESC - op o to nie prosił ale rzeczywiście to jest przydatne (o ile nie potrzebuje używać escapa)

"Zamiast generować ciąg znaków "44441" generuje "q4444144441" - no jak się przytrzyma chwilkę q to rzeczywiście

"Local $hDLL = DllOpen("user32.dll") jest zupełnie zbędny"  - masz rację

"funkcja Send umożliwia wielokrotne wysyłanie tego samego klawisza" - masz rację

Opublikowano

OK. Rzeczywiście nie wiadomo czy to q będzie przeszkadzało, czy jest wręcz niezbędne. Nie mam zielonego pojęcia do czego ten skrypt jest potrzebny Kumarex'owi.

Twój skrypt będzie oczywiście działał chyba prawidłowo po małych poprawkach.

Ponieważ AutoIt jest w pewnym stopniu językiem wieloparadygmatowym (https://pl.wikibooks.org/wiki/AutoIt/O_języku_AutoIt), można pewne rzeczy robić w różny sposób

Ty użyłeś paradygmatu imperatywnego, a ja zdarzeniowego.

Twój kod jest więc dokładnym opisem czynności jakie skrypt ma wykonać, natomiast mój opisuje jak skrypt ma zareagować na konkretne zdarzenia (w naszym wypadku jest to wciśnięcie odpowiedniego klawisza).

Podejście zdarzeniowe, w naszym przypadku ma pewną przewagę nad imperatywnym. W moim skrypcie pętla programu jest w zasadzie pusta (jeżeli nie liczyć Sleep'a), natomiast twój skrypt ciągle odpytuje bufor klawiatury. Ma to pewne znaczenie dla większego obciążenia procesora, chociaż dla tak prostego skryptu nie jest to chyba szczególnie istotne.

 

Pozdrawiam i życzę przyjemności w obcowaniu z AutoIt'em.

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...