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 user profile iconKlabautermann: 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 user profile iconKlabautermann: 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..3of 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), 00);
End{ For } 
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{ For }
End{ PostKeyEx32 }


Delphi-Quelltext
1:
PostKeyEx32((ord('S')), [ssShift], FALSE);                    


Meinst du so?

Moderiert von user profile iconKlabautermann: 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.