Verschiedene Arten um Keystrokes zu simulieren?

07/21/2007 09:51 pengpong#1
Hi,
hat irgendwer Ahnung was für verschiedene Möglichkeiten es gibt Tastendrücke an ne andere Applikation zu testen?
Also, welche Funktionen werden von den ganzen Makro Tools benutzt?
Mich wundert es halt, dass GameGuard z.B. so tools wie Synergy oder das MakroTeil der G15 ignoriert, aber auf der anderen Seite funktioniert das N52 einwandfrei.
Da muss es also unterschiede geben....
07/23/2007 01:59 pengpong#2
jo, danke, das geht schonmal in die richtung, nach was ich gesucht habe =)
Wobei ich noch immer nach Wegen suche, das ganze 'tiefer' anzugehen...
Also auf ganz blöd sowas in Richtung Device Treiber, etc... (bin auch schon dran nen Atmel per USB als HID Interface anzuschließen o.O)
07/23/2007 12:50 mr.rattlz#3
Quote:
Originally posted by pengpong@Jul 23 2007, 01:59
jo, danke, das geht schonmal in die richtung, nach was ich gesucht habe =)
Wobei ich noch immer nach Wegen suche, das ganze 'tiefer' anzugehen...
Also auf ganz blöd sowas in Richtung Device Treiber, etc... (bin auch schon dran nen Atmel per USB als HID Interface anzuschließen o.O)
Klingt ja interessant, welche Hardware hast du genau vor zu verwenden ;) ?
07/23/2007 12:57 rEdoX#4
Mir fallen spontan SendInput, keybd_event und SendMessage ein.
Treiber programmierung ist nicht gerade eine meiner staerken, deswegen faellt mir dazu leider nichts ein.
07/23/2007 15:15 pengpong#5
Quote:
Originally posted by mr.rattlz+Jul 23 2007, 12:50--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (mr.rattlz @ Jul 23 2007, 12:50)</td></tr><tr><td id='QUOTE'>Klingt ja interessant, welche Hardware hast du genau vor zu verwenden ;) ?[/b]

es gibt für die Atmel Mikroprozessoren ein paar software only usb libraries, die den atmel über nur 2 pins an den usb port koppelt.

z.b. -> [Only registered and activated users can see links. Click Here To Register...]

Wenn man das ganze als HID zusammenbastelt, fällt auch die Treiberprogrammierung weg (-> für ne USB Tastatur hat Windows ja nen Treiber dabei...)

[Only registered and activated users can see links. Click Here To Register...]
Das ist ein einfacher Schaltplan für ne 17-Tasten keyboard.
Wenn das Bild ein bisschen größer wäre, erkennt man folgendes:
links sind die ganzen Taster, auf der rechten Seite ist der ganze Rest.

Oben rechts ist ein 12Mhz Quartz (der Atmega8 der da verbaut ist, kann intern nur mit 1-8Mhz getaktet werden, mit nem externen Quartz bis zu 16, die USB Library von obdev benötigt entweder 12 oder 16Mhz)

D+ und D- (die beiden USB Datenleitungen) werden über jeweils nen kleinen Widerstand an den Atmel angeschlossen.

D- wird zusätzlich noch mit nem 1k Widerstand auf die +5V Leitung gelegt (dadurch erkennt das OS, dass ein Gerät angeschlossen wurde)

Die zwei Dioden an +5V sind anscheinend dafür da, dass die Spannung auf ~3V gesenkt wird, da das der richtige Pegel für die USB Datenleitungen sind.


So versteh ich das ganze zumindest, aber nachdem ich kein ETechniker bin, gibts da bestimmt den ein oder anderen Fehler in der Beschreibung ;)

Auf alle Fälle ist der Schaltplan recht easy...

Softwareseitig wird der Atmel dann per C programmiert (oder Assembler, es gibt sogar ein Basic Compiler, aber der hat afaik keine USB Library)


blablablablablub... jetzt aber genug davon ;)


<hr>Append on Jul 23 2007, 15:21<hr><!--QuoteBegin--rEdoX
@Jul 23 2007, 12:57
Mir fallen spontan SendInput, keybd_event und SendMessage ein.
Treiber programmierung ist nicht gerade eine meiner staerken, deswegen faellt mir dazu leider nichts ein.
[/quote]
jap, p01nt3r hat das ja auch schon angesprochen.
wobei keybd_event seit XP von SendInput abgelöst wurde ("Windows NT/2000/XP/Vista:This function has been superseded. Use SendInput instead.")

Ich teste im Moment gerade SendInput/SendMessage, mal sehen wie weit ich damit komm...
07/25/2007 16:13 apollo#6
Hallo !

SendMessage ist gefährlich, da dass Zielfenster sehen kann, von welchem Prozess/Thread der Aufruf kommt.

PostMessage ist ungefährlich, da das Betriebssystem den Aufrufer nicht mitprotokolliert. Wenn die Message ausgeführt wird, kann das Zielfenster sie nicht mehr von regulären Messages unterscheiden.

MFG Apollo
07/25/2007 20:20 pengpong#7
Ah, sehr guter Tip apollo, danke
08/03/2007 00:27 wiz#8
Nebenbei wurden bei irgendeinem (oder bei allen?) APIs ein Injected-Flag gesetzt. Wenn es das Zielprogramm darauf anlegt, kann es sehen, dass die Tasten emuliert und nicht physisch gedrückt wurden. Wenn es wirklich sicher(er) sein sollte, sollte ein Devicetreiber das ganze auch erledigen, aber da muss ich auch passen.
08/04/2007 02:43 pengpong#9
Sodala, ich hab ein bisschen getestet und das mit SendInput scheint zu funktionieren...
Von dem ganzen Post/SendMessage hab ich erstmal Abstand genommen.

Der Trick bei SendInput ist, dass man dadurch, dass man kein Ziel bei SendInput angeben kann, man erst einmal mit AttachThreadInput den eigenen Input auf das Zielprogramm richten muss.

Folgender Code funktioniert bei mir:

Code:
HWND targetHWND=0;
DWORD thisThread,otherThread;

//Ziel finden
targetHWND=FindWindowA&#40;NULL,&#34;Zielprogramm&#34;&#41;;
if&#40;targetHWND==0&#41; {MessageBoxA&#40;0,&#34;Can't find...&#34;,&#34;OUCH&#34;,0&#41;;}


//ThreadId für Quelle/Ziel ermitteln
thisThread=GetCurrentThreadId&#40;&#41;;
otherThread=GetWindowThreadProcessId&#40;targetHWND,NULL&#41;;



//Verbinden....
if&#40;!AttachThreadInput&#40;thisThread,otherThread,true&#41;&#41; {
	MessageBoxA&#40;0,&#34;Oh noes...&#34;,&#34;OUCH&#34;,0&#41;;
}

//Wir wollen ein &#60;Return> senden
KEYBDINPUT kip;
kip.wVk = VK_RETURN;
kip.wScan = NULL;
kip.dwFlags = NULL;
kip.time = 0;

INPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki = kip;



//Folgende Zeilen machen Probleme bei Lineage, sind aber dort auch nicht unbedingt nötig
//Wenn man das ganze mit z.B. Notepad testen möchte, braucht man sie allerdings....
//SetForegroundWindow&#40;targetHWND&#41;;
//SetFocus&#40;targetHWND&#41;;

SendInput&#40;1,&ip,sizeof&#40;INPUT&#41;&#41;;


//Verbindung lösen
AttachThreadInput&#40;thisThread,otherThread,false&#41;;

[Only registered and activated users can see links. Click Here To Register...]
Hier steht übrigens drinnen, warum man Post/Sendmessage nicht benutzen sollte um Keyboard Input zu simulieren.....
08/04/2007 04:34 pengpong#10
So, mein kleines Proof-of-Concept Teil ist fertig.

Ausgangssituation:
Zwei PCs mit jeweils einem Lineage Client.
Für's Dual-Boxing hätte ich gerne die Möglichkeit, Tasteneingaben an den zweiten PC zu schicken.

Lösung:
Auf dem 1.PC läuft ein Programm, dass verschiedene Hotkeys registriert und per Netzwerk an den 2.PC schickt.
Auf dem 2.PC läuft ein anderes Programm, dass die Eingabe per Netzwerk erhält und dann per SendInput Tasten an den Lineage Client sendet.

Das ganze ist ein VisualC 2005 Projekt.
Alles eher Quick'n'Dirty hingerotzt, aber es funktioniert bei mir ;)

Die 3 Hotkeys sind <windows-taste>-(F9|F10|F11) wobei win-F11 das Programm beendet.

Auf der Server seite wird F1 an Lineage geschickt, wenn win-f9 gedrückt wird, bzw. F2 bei win-f10

Das Projekt an sich wird jetzt für die meisten eher uninteressant sein, aber man kann es evt. als Basis für was eigenes benutzen (don't forget the credits :-p)