Entwickler-Ecke

Windows API - Strings in andere Programme schreiben


HenryHux - So 24.10.10 16:49
Titel: Strings in andere Programme schreiben
Hi,

ich wollte mal fragen, wie es möglich ist einen im Programm vorhandenen String in ein anderes Programm zu schreiben.
Hätte mir das so vorgestellt, dass es auf eine Stelle aufm Desktop klickt und somit auf ein Fenster zb ICQ.
Danach soll er dann den String dort eingeben, eintippen, wie auch immer.
Gibt es da eine "einfache" Methode über Tastatursimulationen und nicht per Handles oder so?

Lg

Henry


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 25.10.2010 um 09:58


jaenicke - So 24.10.10 17:20

Schau dir einmal keyb_event [http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx] an. ;-)


bummi - So 24.10.10 19:43

Ich glaube unter dem Name Sendkeys findest Du in Google fertige Routinen


Delete - So 24.10.10 22:07

Ohne Handle? Ich will mit dem Auto nach Hamburg fahren, aber ohne Motor. Wie mache ich das?


bummi - So 24.10.10 22:36

zum anpassen:


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:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
{-----------------------------------------------------------------------------
  Procedure: SendKeys
  Author:    Thomas Wassermann
  Date:      17-Aug-2004
  Arguments: sText: String
  Result:    None
  Remarks:   None
-----------------------------------------------------------------------------}

procedure SendKeys(sText: String);

var
 i             : Integer;
 shift         : Boolean;
 vk, scancode   : Word;
 ch            : Char;
 c, s          : Byte;
const
 vk_keys       : Array[0..9of Byte=(VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
 vk_shft       : Array[0..2of Byte=(VK_SHIFT, VK_CONTROL, VK_MENU);
 flags         : Array[FALSE..TRUE] of Integer = (KEYEVENTF_KEYUP, 0);
 C_ALTGRS = ['\','@','~','²','³','€','{','}','[',']'];

begin
 shift:=FALSE;
 for i:=1 to Length(sText) do begin
   ch:=sText[i];
     if (ch>=#250then begin
     s:=Ord(ch)-250;
     shift:=NOT Odd(s);
     c:=vk_shft[s shr 1];
     scancode:=MapVirtualKey(c, 0);
     Keybd_Event(c, scancode, flags[shift], 0);
   end else begin
     vk:=0;
     if (ch>=#240then
       c:=vk_keys[Ord(ch)-240]
     else if (ch>=#228then
       c:=Ord(ch)-116
     else if (ch<#32then
       c:=Ord(ch)
     else begin
       vk:=VkKeyScan(ch);
       c:=LoByte(vk);
     end;

     scancode:=MapVirtualKey(c, 0);

     if (sText[i] in C_AltGRS) then Keybd_Event(VK_RMENU, MapVirtualKey(VK_RMENU,0), 00)
     else if (NOT shift AND (Hi(vk)>0)) then Keybd_Event(VK_SHIFT, $2A00 );
     Keybd_Event( c, scancode, 00 );
     Keybd_Event( c, scancode, KEYEVENTF_KEYUP, 0 );
     if (sText[i] in C_AltGRS) then Keybd_Event(VK_RMENU,MapVirtualKey(VK_RMENU,0), KEYEVENTF_KEYUP, 0)
     else if (NOT shift AND (Hi(vk)>0)) then Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);

   end;
   Application.ProcessMessages;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Hide;
  Application.ProcessMessages;
  SendKeys('was auch immer') ;
  Show;
end;


Xion - So 24.10.10 22:51

Hi,

du kannst mal hier gucken (Kapitel 3 vor allem)
http://www.delphi-library.de/topic_Kommunikation+von+zwei+Programmen+ueber+Messages_97738.html
Das beschreibt ziemlich genau das, was du zum Auslesen eines ICQ Fensters brauchst.

Das ganze funktioniert natürlich mit Handles, ist aber ziemlich einfach und nicht so umständlich (und ungenau) wie mit "Maus durch die Gegend schieben".

Wenn du unbedingt keine Handles willst, könntest du mal verraten warum, vielleicht kommt man dann auf eine andere Lösung ;)


bummi - So 24.10.10 23:40

@XION
Ich kann nur raten wofür er es braucht...
Ich selbst habe es gebraucht um eigene Drucker im Hintergrund zu installieren, um batchmäßg Formulare auszufüllen etc...

geht mit Sendkeys fast alles und ohne Handles


jaenicke - Mo 25.10.10 01:07

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
Ich selbst habe es gebraucht um eigene Drucker im Hintergrund zu installieren
Das geht mit der entsprechenden API aber viel einfacher und zuverlässiger. ;-)

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
geht mit Sendkeys fast alles und ohne Handles
Man hat aber auch das Problem, dass man nicht steuert wo man die Tasten eingibt. Wenn das das falsche Fenster ist, simuliert man vielleicht Enter, wenn da die Frage steht "c:\programme löschen?"...


HenryHux - Mo 25.10.10 18:41

Hi,

danke erstmal für die Antworten, klappt soweit.
Hab einiges über Handles gelesen, ist mir aber nie so recht gelungen, deswegen erstmal so ne Methode =) Wie wären denn die entsprechenden API? Habt ihr vlt nen paar Links oder so, dann würd ich mir das mal durchlesen.

Danke,

Henry