Maussimulationen (auch für Anfänger geeignet)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.

Nutzen dieses Codes?

Nützlich
12
50%
Weniger nützlich
8
33%
Könnt' man besser machen
4
17%
 
Insgesamt abgegebene Stimmen: 24

Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Maussimulationen (auch für Anfänger geeignet)

Beitrag von AND51 »

Hallo!

Ich habe einen Code geschrieben, den ich der Allgemeinheit zur Verfügung stellen möchte.

Es handelt sich hier um eine Procedure, die die Maus an eine bestimmte Stelle bewegt und dort eine beliebige, optionale Aktion ausführt. Das heißt: Ich kann mit diesem Code zum Beispiel die Maus zur Position 800,600 bewegen und, wenn ich will, dort ein Linksklick simulieren lassen. Zusätzlich kann ich bestimmen, mit welcher Geschwindigkeit sich die Maus bewegen soll. Außerdem kann ich noch festlegen, ob, während die Simulation läuft, Maus und Tastatur für den Benutzer gesperrt werden.

Code: Alles auswählen

Procedure maus(x, y, aktion1, aktion2, speed, block)
	; © by AND-Software/AND51, 03/03/2006
	BlockInput_(block And 1)
	x=Abs(x)
	y=Abs(y)
	Protected a.l, b.l, sa.l, sb.l
	Repeat
		a=x-DesktopMouseX()
		b=y-DesktopMouseY()
		sa=1
		sb=1
		If a < 0
			sa=-1
		EndIf
		If b < 0
			sb=-1
		EndIf
		If DesktopMouseX() = x
			sa=0
		EndIf
		If DesktopMouseY() = y
			sb=0
		EndIf
		SetCursorPos_(DesktopMouseX()+sa, DesktopMouseY()+sb)
		Delay(Abs(speed))
	Until DesktopMouseX() = x And DesktopMouseY() = y
	If aktion1 <> 0 : mouse_event_(aktion1, x, y, 0, 0) : EndIf
	If aktion2 <> 0 : mouse_event_(aktion2, x, y, 0, 0) : EndIf
	BlockInput_(#False)
	ProcedureReturn #True
EndProcedure

maus(420, 60, #MOUSEEVENTF_LEFTDOWN, #MOUSEEVENTF_LEFTUP, 5, #True)
Aufrufen mit
maus(x, y, aktion1, aktion2, speed, block)

Hier die Erklärung:
x: X Koordinate, an die die Maus bewegt werden soll
y: Y Koordinate, an die die Maus bewegt werden soll
aktion1: Erste, optionale Aktion, die ausgeführt wird, Beispiel: Linke Maustaste drücken
aktion2: Zweite, optionale Aktion, die Ausgeführt wird, Beispiel: Linke Maustaste loslassen (nicht vergessen!)
speed: Siehe Repeat-Schleife, wenn null, dann springt die Maus sofort zur angegebenen Stelle
block: Wenn #True, dann wird die Maus und die Tastatur (solange der Mauszeiger vom Programm bewegt wird) blockiert

ProcedureReturn: Diese Procedure gibt immer #True (1) zurück, nützlich für Repeat/Until Schleifen, damit man weiß, wann die Simulation zu Ende ist!
Soll die Maus nicht bewegt werden, sondern nur eine AKtion ausgeführt werden, dann setzte man für x einfach DesktopMouseX() und für y einfach DesktopMouseY() ein!
Soll keine Aktion ausgeführt werden, einfach für aktion1 und aktion2 eine null (0) einsetzen!

So ziemlich alles ist idiotensicher (oder, wie es in der PB-Hilfe heißt: "kugelsicher"), so kann speed auch negativ sein oder block eine positive oder negative Zahl, um das Blockieren einzuschalten. aktion1 und aktion2 sollten 0 (null) sein, wenn kein Klick getätigt werden soll, wenn also nur die Mausbewegung erwünscht ist. Sogar die Koordinaten können negativ sein; durch die Funktion Abs() wird immer der Betrag der Yahl genommen, also wenn ich aufrufe maus(-73, -678, ...), würde die Maus trotzdem zur Position 73,678 bewegt werden.
Bitte hier nachschauen, wenn weitere Informationen zu aktion1 und aktion2 gewünscht sind: http://msdn.microsoft.com/library/defau ... _event.asp


Bitte postet doch eure Meinung dazu. Dieser Code ist auch für Anfänger geeignet!
Zuletzt geändert von AND51 am 31.03.2006 12:03, insgesamt 3-mal geändert.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Dir ist klar, das Blockinput unter jeder Windows-Version anders reagiert?
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Soweit ich das in der MSDn gelesne habe wird BlockInput_(1) die Eingabe blocken, egal, welches OS verwendet wird. BlockInput_(0) kann übrigens nur von dem Thread/Programm erfolgreich ausgeführt werden, das auch angefangen hat zu blocken.

Wer sich unsicher ist, kann die Blockierfunktion ja rausstriechen, ich habe sie jedenfalls unter Windows XP mit Server Pack 2 und den ersten 40 Updates nach der gestrigen Neuinstallation erfolgreich getestet ;-) .

Gott, diese neue tastaur macht mich whansniig!! :lol:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Bei mir hat die Maus nach deiner Procedur gesponnen.
Immer wenn ich einen Linksklick gemacht habe, folgte ein Rechtsklick. :?
(Ein von mir ausgeführter Rechtsklick hat das Problem behoben)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Betriebssystem Resultat von "BlockInput_"
Windows 95 Kein Effekt.
Windows 98/Me Nutzer-Input ist blockiert, aber Dein Programm kann ebenfalls keine Eingaben simulieren.
Windows NT 4 (Ohne ServicePack 6) Kein Effekt.
Windows NT 4 (Mit ServicePack 6) Nutzer-Input ist blockiert, und Dein Programm kann die meisten Eingaben simulieren.
Windows 2000 Nutzer-Input ist blockiert, und Dein Programm kann die meisten Eingaben simulieren.
Windows XP Nutzer-Input ist blockiert, und Dein Programm kann die meisten Eingaben simulieren.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Danke für eure Meinungen!

@ Macros: So ein Problem habe ich bei mir noch nicht festgestellt. Woran könnte das denn liegen, habe ich etwas falsch gemacht?
Ich weiß nur, das, wenn man die Maustaste runterdrückt, muss man sie mit einem zweiten befehl wieder lösen.

@ TS-Soft: Das wusste ich (noch) nicht. WO hast du diesen Text her?
Ich habe auf dieser Seite nachgeschaut und da steht dein Text so nicht da:
The BlockInput function blocks keyboard and mouse input events from reaching applications.

Syntax

BOOL BlockInput( BOOL fBlockIt
);
Parameters

fBlockIt
[in] Specifies the function's purpose. If this parameter is TRUE, keyboard and mouse input events are blocked. If this parameter is FALSE, keyboard and mouse events are unblocked. Note that only the thread that blocked input can successfully unblock input.
Return Value

If the function succeeds, the return value is nonzero.

If input is already blocked, the return value is zero. To get extended error information, call GetLastError.




Remarks

When input is blocked, real physical input from the mouse or keyboard will not affect the input queue's synchronous key state (reported by GetKeyState and GetKeyboardState), nor will it affect the asynchronous key state (reported by GetAsyncKeyState). However, the thread that is blocking input can affect both of these key states by calling SendInput. No other thread can do this.

The system will unblock input in the following cases:


The thread that blocked input unexpectedly exits without calling BlockInput with fBlock set to FALSE. In this case, the system cleans up properly and re-enables input.
Windows 95/98/Me: The system displays the Close Program/Fault dialog box. This can occur if the thread faults or if the user presses CTRL+ALT+DEL.
Windows 2000/XP: The user presses CTRL+ALT+DEL or the system invokes the Hard System Error modal message box (for example, when a program faults or a device fails).
(http://msdn.microsoft.com/library/defau ... kinput.asp)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Nein, die Events stimmen schon, es muss an etwas anderem liegen.
Ich hab ja auch schon mit mouse_event_() gearbeitet.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Also ich kann nur sagen, dass es bei mir einwandfrei funktioniert, schließlich habe ich den Code vor Veröffentlichung ausreichend getestet :-P

Aber vielleicht kannst du es nach einem Neustart nochmal ausprobieren, ob der "Bug" immer noch auftritt?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Ich hab es schon mehrmals nach Neustarts getestet,
immer wieder die gleichen Fehler.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Naja, dann kann es ja eigentlich nur an Windows liegen, oder? Welches OS hast du denn? Windows - Klar! Aber welches?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten