Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: So 24.10.10 16:49 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 24.10.10 17:20 
Schau dir einmal keyb_event an. ;-)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 24.10.10 19:43 
Ich glaube unter dem Name Sendkeys findest Du in Google fertige Routinen
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 24.10.10 22:07 
Ohne Handle? Ich will mit dem Auto nach Hamburg fahren, aber ohne Motor. Wie mache ich das?
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: So 24.10.10 22:36 
zum anpassen:

ausblenden volle Höhe 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;

Für diesen Beitrag haben gedankt: HenryHux
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: So 24.10.10 22:51 
Hi,

du kannst mal hier gucken (Kapitel 3 vor allem)
www.delphi-library.d...+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 ;)

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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