RapidFire Button

Anfängerfragen zum Programmieren mit PureBasic.
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

RapidFire Button

Beitrag von Coder Pinhead »

Hallo Leute,

Habt ihr eine Idee wie man die Maustaste so ansprechen kann das sie für einen in einer vorgeschriebenen Geschwindigkeit klickt wenn man sie gedrückt hällt. Und ja ich weiß das man so was auch per Macro lösen könnte aber würde so was gerne mal mit PureBasic versuchen vor allem da ich ja gerade wieder in PureBasic richtig loslegen möchte.

Ich hoffe ihr könnt mir dabei Helfen und Danke schon ein mal im voraus für die Hilfe.

Eine Möglichkeit wo man so ein Rapid-Fire Testen kann: *Link*
Zuletzt geändert von Coder Pinhead am 07.05.2011 14:31, insgesamt 1-mal geändert.
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: RapidFire Button

Beitrag von STARGÅTE »

Code: Alles auswählen

OpenWindow(0, 0, 0, 800, 600, "Screen", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)

#TimeDifference = 200

Repeat
	
	If GetAsyncKeyState_(#VK_LBUTTON)
		If DownTime < ElapsedMilliseconds()-#TimeDifference
			Debug "Feuer"
			If Not DownTime
				DownTime = ElapsedMilliseconds()
			Else
				DownTime + #TimeDifference
			EndIf
		EndIf
	Else
		DownTime = 0
	EndIf

Until WindowEvent() = #PB_Event_CloseWindow
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: RapidFire Button

Beitrag von Coder Pinhead »

Danke, da lässt sich schon mal was daraus machen jetzt müsst ich nur noch wissen wie ich allgemein Fenster ansprechen kann oder ein gezieltes Fenster ansprechen könnte. :mrgreen:


Gebt mir mal ein Tipp wie man andere Fenster anspricht.
Zuletzt geändert von Coder Pinhead am 16.05.2011 11:19, insgesamt 1-mal geändert.
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: RapidFire Button

Beitrag von Coder Pinhead »

Keiner eine Idee wie man so was mit PureBasic richtig Lösen könnte? :coderselixir:

In AutoHotkey sehe so was Beispielsweise so aus:

Code: Alles auswählen

LAlt::Suspend                     ;ALT Links Ein- und Ausschalter
LButton::
Loop
{SetMouseDelay 45                 ;Klick Geschwindigkeit
Click
If (GetKeyState("LButton","P")=0) ;Linke Maustaste für RapidFire
Break
}
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: RapidFire Button

Beitrag von Regenduft »

Ziemlich sinnfrei, aber lustiger Weg zum Erlernen von Mauseingabesynthese! :lol:

In Deiner Signatur steht, dass Du Anfänger bist, aber länger im Board als ich... Weiß Dich gerade nicht wirklich einzuschätzen... :?
Schau Dir mal Deinen (bzw. Stargates) Code genauer an: Der macht noch nichts, das ist nur die Taktung! Es reicht nicht <Debug "Feuer"> durch <Debug "RapidFire"> zu ersetzen. :doh:

Quellen zum Einarbeiten:

Wenn's für Windows ist geht's per API mit den "alten Funktionen" mouse_event_() für Mauseingabesynthese sowie (wenn schon dabei bist :wink:) keybd_event_() für Tastatureingabesynthese.

Die zwei oben genannten API-Funktionen sind gut für den "Einstieg". Wenn Du ein wenig mit rumgespielt hast und begriffen hast, wie es funktioniert, dann kannst Du Dich an die "neue Funktion" SendInput_() ranwagen, welche sozusagen mouse_event_() und keybd_event_() vereint, d.h. Du kannst mit Ihr Maus- und Tastatureingabe synthetisieren (+ Hardwareeingabe, wo ich aber keinen Plan von habe :oops:). Der Vorteil ist, dass Du eine Reihe von Events mit einem Aufruf absetzten kannst.

Grundlegendes:
  • Maus- wie Keyboardtasten benötigen für eine Betätigung immer ZWEI Anweisungen, "Taste drücken" und "Taste loslassen".
  • Der Effekt ist der gleiche wie bei "echten" Eingaben! Du kannst damit ein ziemliches Tohuvabohu veranstanten!
  • Admin-Manifest einbinden! User dürfte nicht genügen! (Bin zwar "XPler" und weiß es somit nicht aus erfahrung, aber wenn User reichen würde wäre es echt ein Witz...)
Tipp: Probiere das Prinzip als erstes an keybd_event_() aus und halte folgenden Code (am besten kompiliert <)) bereit, damit Du im Notfall alle Tasten per Software "loslassen" kannst (Meistens wird wegen dem Doppelklick beim starten eine Taste mehr als nötig gelöst: #VK_LBUTTON; also lass Dich davon nicht irriteren):

Code: Alles auswählen

If OpenConsole()

  Dim KeyInput.INPUT($FF)
  For i = $00 To $FF
    If GetAsyncKeyState_(i) & ~1
      PrintN("Löse VirtualKey: "+Str(i)+" ($"+Hex(i)+")")
      KeyInput(Anzahl)\type       = #INPUT_KEYBOARD
      KeyInput(Anzahl)\ki\wVk     = i
      KeyInput(Anzahl)\ki\dwFlags = #KEYEVENTF_EXTENDEDKEY|#KEYEVENTF_KEYUP
      Anzahl + 1
    EndIf
  Next i

  PrintN("")
  PrintN("Fertig! Es wurden "+Str(SendInput_(Anzahl, @KeyInput(), SizeOf(INPUT)))+" von "+Str(Anzahl)+" gedrückten Tasten gelöst.")
  Input()
  
EndIf
Wenn Du später das ganze nur für ein bestimmtes Fenster "aktivieren" möchtest weiß ich das jetzt auch nicht so aus dem Stehgreif. Mit GetForegroundWindow_() bekommst Du das Handle des aktuell aktiven Fensters. Dann halt noch z.B. den Fenter-Titel ermitteln um zu schauen, ob's sich um Dein gewünschtes Zielfenster handelt. Musst Dich mal durch dir Window-APIs durchwühlen (...also Window... nicht Windows :freak:).
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: RapidFire Button

Beitrag von Coder Pinhead »

Regenduft hat geschrieben:In Deiner Signatur steht, dass Du Anfänger bist, aber länger im Board als ich... Weiß Dich gerade nicht wirklich einzuschätzen... :?
War für eine lange Zeit nicht mehr am Computer aus diversen gründen. Damals wo ich mich Registriert hatte war ich noch Blutiger Basic angefangener. Bin dementsprechend da ich längere Zeit inaktive war noch auf meinem alten Stand bzw. bin etwas eingerostet. Werde mir die Befehle die du geschrieben hast mal anschauen und mal schauen was ich damit anfangen kann :).
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: RapidFire Button

Beitrag von Regenduft »

Brauchst Dich nicht "rechtfertigen". Will nur (z.B.) folgendes vermeiden:
Regenduft: "API API API API API API API API API"
Coder Pinhead: "Aha..."
Regenduft: "Structure Structure Structure Structure Structure Structure"
Coder Pinhead: "Oho..."
Regenduft: "Zeiger Zeiger Zeiger Zeiger Zeiger Zeiger Zeiger Zeiger Zeiger"
Coder Pinhead: "Mhm..."
Regenduft: "Alles Roger?"
Coder Pinhead: "Was ist denn ein String?"
Regenduft: :o >_< :bluescreen:

(Nicht angreifend sondern überspitzt lustig gemeint :wink:)
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Coder Pinhead
Beiträge: 234
Registriert: 27.02.2007 10:54
Wohnort: Germany

Re: RapidFire Button

Beitrag von Coder Pinhead »

Habe mich nun etwas mit den WinAPI's beschäftigt und Krieg es trotzdem nicht gebacken.
Also ich habe das Programm zwar schon soweit das es z.B. wenn ich auf mein Startmenü oder auf irgend etwas in der Task-leiste schnell klickt und dort alles auf bzw. zuklappt. Nur wären da noch zwei Sachen die für mich ungelöst sind und zwar Funktioniert mein Programm z.B. nicht in Spielen wie z.B. King of Buttons und es lastet mein System zu 85 - 100 Prozent aus. Kann nicht wer ein kleines Funktionierendes Beispiel schreiben was ich mir anschauen kann damit ich die Funktionsweise verstehe und das endlich hinkriege :).
Windows 8.1 x64 | PureBasic v5.x x86/x64

Sämtliche Syntax, Tipp und Rechtschreibfehler unterliegen dem Copyright des Verfassers.
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: RapidFire Button

Beitrag von Regenduft »

Poste doch einfach mal Deinen Code, dann weißt Du nicht nur wie es funktioniert, sondern auch warum es bei Dir nicht funktioniert hat. Brauch Dir auch nicht peinlich sein, denn jeder hier war mal Anfänger! :)
Coder Pinhead hat geschrieben:Es lastet mein System zu 85 - 100 Prozent aus.
Das geschieht immer, wenn man im Programm entweder mit WindowEvent() anstatt WaitWindowEvent() arbeitet und/oder kein Delay() pro Schleifendurchlauf drin hat.
Zum Verständnis: Während einer Delay-Zeit wird dem Prozess vom Betriebssystem keine "Rechenzeit" zur Verfügung gestellt. Diese Zeit steht dann anderen Prozessen zur Verfügung. Wenn diese anderen Przozesse diese Zeit nicht "wollen", dann werden sie dem "Leerlaufprozess" geschenkt, sprich garnix gemacht (auch "NOP" oder "NOOP" wie "No Operation").
WaitWindowEvent() hat (sozusagen) ein eingebautes Delay(). Das Betriebssystem weist dem Prozess solange keine Rechenzeit zu, bis ein Event auftritt.

Beispiele:
(alle Codes setzen vorraus, das bereits ein Fenster geöffnet wurde. Der Übersichlichkeit zu liebe habe ich das in den Code-Schnippseln hier weggelassen.)

1. KEIN WaitWindowEvent() und KEIN Delay() = 100% Auslastung:

Code: Alles auswählen

Repeat

  WinEvnt = WindowEvent()

  If WinEvnt
    ; ... Event-Auswertung ...
  EndIf
  
Until WinEvnt = #PB_Event_CloseWindow
2. WaitWindowEvent() und KEIN Delay() < 100% Auslastung:

Code: Alles auswählen

Repeat

  WinEvnt = WaitWindowEvent() ; <- Solange NOP, bis Event auftritt

  If WinEvnt
    ; ... Event-Auswertung ...
  EndIf
  
Until WinEvnt = #PB_Event_CloseWindow
3. KEIN WaitWindowEvent() ABER Delay() < 100% Auslastung:

Code: Alles auswählen

Repeat

  WinEvnt = WindowEvent()

  If WinEvnt
    ; ... Event-Auswertung ...
  Else
    Delay(10) ; <- Wenn KEIN Event, dann 10 ms NOP.
  EndIf
  
Until WinEvnt = #PB_Event_CloseWindow
Beim dritten Beispiel siehtst Du, dass ich das "Delay(10)" nur aufrufe, wenn "WinEvnt" gleich 0 ist. Das hat den Vorteil, das wenn viele Events zum Verarbeiten in der Event-Queue (= Warteschlange) stehen, diese ruck-zuck hintereinander ohne Wartezeit zwischen den einzelnen Events abgeabeitet werden. Würe ich das nicht machen würden z.B. 100 direkt aufeinanderfolgende Events eine ganze Sekunde zur Abarbeitung benötigen:

Code: Alles auswählen

Repeat

  WinEvnt = WindowEvent()

  ; ... Event-Auswertung ...
  
  Delay(10) ; <- Macht das Programm bei vielen Events träge!
  
Until WinEvnt = #PB_Event_CloseWindow
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten