Entwickler-Ecke
Windows API - Tastebdruck vortäuschen
DeadlyAppearance - Di 10.12.02 09:33
Titel: Tastebdruck vortäuschen
Hiho, mal ne Frage:
Ich brauche ein Programm, was mit einem Timer alle 60 sec den Tastendruck 1 vortäuscht. Also ich möchte, dass das Programm im Hintergrund läuft(nicht ausgewählt) und eine andere Software, z.B. Word nun denkt, das die Taste 1 gedrückt wurde und eine 1 Schreibt.
Ich glaube es könnte irgend wie SendMessage functionieren, habe aber leider noch nicht so die Ahnung von Delphi, plz help.
retnyg - Di 10.12.02 10:21
wie wärs mit
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var hnd:= HWND; hnd := findwindow('Microsoft Word'); if hnd <> 0 then begin setforegroundwindow(hnd); sendkeys('{1}'); end; |
um den befehl sendkeys benutzen zu können musst du die Unit sndkey32.pas zu deinem Projekt hinzufügen (ist auf der Delphi-CD, aber auch mit google leicht zu finden)
gruss retnyg
Moderiert von
Klabautermann: Code- durch Delphi-Tags ersetzt.
DeadlyAppearance - Di 10.12.02 10:53
Schin mal big Thx, nur noch ne Frage, wo her weis ich, wie son Fenster heißt?
DeadlyAppearance - Di 10.12.02 11:05
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var hnd : HWND;
begin hnd := findwindow('Microsoft Word'); if hnd <> 0 then begin setforegroundwindow(hnd); sendkeys('{1}'); end; end; |
Also in der Zeile, wo hnd das zu gewiesen wird, wird noch etwas erwartet, aber was?
Moderiert von
Klabautermann: Code- durch Delphi-Tags ersetzt.
Delete - Di 10.12.02 11:06
FindWindow brauch zwei Parameter: 1. Klassennamen, 2. Fenstertext. Nutzt du nur eins von beiden übergib bei dem ungenutzen nil.
DeadlyAppearance - Di 10.12.02 12:42
Cool, danke es funzt, thx @ all.
DeadlyAppearance - Mi 11.12.02 11:27
So, also hab es nun hinbekommen, funktioniert wunder bar. Doch nun stehe ich vor de Problem, dass ich die Tasten "Shift + s" vortäuschen muss. Hab aber in keiner ASCII Tabelle gefunden, wie ich die Shifttaste anspreche. Plz help.
Delete - Mi 11.12.02 11:30
Du willst nicht zufälligerweise auf einen Button klicken? :roll:
DeadlyAppearance - Mi 11.12.02 12:00
Nein möchte ich nicht. Aber ich möchte einer Software vortäuschen, als ob man die beidem Tasten Shift + s drücken würde.
Delete - Mi 11.12.02 12:04
Wie reagiert denn das Programm auf Shift+s?
DeadlyAppearance - Mi 11.12.02 12:26
Ist halt wie ein Shortcut, nir wie man halt ne Zahl vortäuscht, weis ich nun. Für was ich es brauche, sollte ja un wichtig sein, ich möchte jediglich wissen, wich ich einem Programm das gleiche übermittel, wie wenn ich die Shift Taste gedrück hätte.
Delete - Mi 11.12.02 12:35
Für was du das brauchst ist nicht unbedingt unwichtig, eventuell findet sich ja eine besser Lösung.
Ist der Shortcut einem Menüeintrag zugeordnet oder einem Button oder sonst einem Control?
Wenn ich eine fremde Anwendung "fernsteuern" will, dann ist es meist einfacher, wenn man sich von der Vorstellung löst es so machen zu wollen, als wenn man es selber bedient. Besser ist es man macht es so, wie es Windows im Endeffekt macht. Also statt versuchen zu wollen einen Mausklick zu simulieren, ist es einfacher, wenn man an das Programm die Message schickt, die auch Windows an das Programm bei einem Mausklick schickt. Bei einem Button wäre das zum Beispiel BM_CLICK. Das ist sehr viel einfachher, als wenn ich jetzt den Shortcut an das Programm sende, auf den der Button normalerweise reagiert.
DeadlyAppearance - Mi 11.12.02 13:09
Wenn es auch mit so einer Message geht, isses ja k, dann wäre ein Beispiel sehr net. Das Programm soll halt einfach glauben, ich würde Shift + s drücken.
Ghost - Mo 16.12.02 17:12
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| Procedure PostKeyEx32(key: Word; Const shift: TShiftState; specialkey: Boolean); Type TShiftKeyInfo = Record shift: Byte; vkey : Byte; End; byteset = Set of 0..7; Const shiftkeys: Array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL), (shift: Ord(ssShift); vkey: VK_SHIFT) , (shift: Ord(ssAlt); vkey: VK_MENU)); Var flag: DWORD; bShift: ByteSet absolute shift; i: Integer; Begin For i := 1 To 3 Do Begin If shiftkeys[i].shift In bShift Then keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); End; if specialkey Then flag := KEYEVENTF_EXTENDEDKEY Else flag := 0;
keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 ); flag := flag or KEYEVENTF_KEYUP; keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
For i := 3 DownTo 1 Do Begin If shiftkeys[i].shift In bShift Then keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0); End; End; |
Delphi-Quelltext
1:
| PostKeyEx32((ord('S')), [ssShift], FALSE); |
Meinst du so?
Moderiert von
Klabautermann: Code- durch Delphi-Tags ersetzt.
Delete - Mo 16.12.02 17:19
Das wird immer schlimmer.
Mein Ansatz wäre, den Wert direkt in der Registry zu ändern. Und dann hoffen, dass man mit WM_SETTINGCHANGE ohne Neustart auskommt. Wenn doch ein Neustart erforderlich wäre, dann einen ähnlichen Weg gehen wie du, nur dass man keine Tastatureingaben simuliert, sondern das ganze über SendMessage macht.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!