Autor Beitrag
Balduin
Hält's aus hier
Beiträge: 8



BeitragVerfasst: So 04.08.02 17:13 
:roll: Hallo Leute,

bin neu hier und auch mit Delphi nicht sonderlich vertraut. Nun zum Thema:

Programmiere gerade eine App die ein Win-Prog. steuert. Ich will nun Tastendrücke emulieren weil die API des Programms nicht genug Befehle bereitstellt. Klartext : Wie kann Delphi z. B in Word die Tasten-Kombi ALT-D emulieren (oder heissts simulieren ?)

Alla bis dann,

_________________
Balduin
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: So 04.08.02 18:46 
gehts auch mit Mausclicks, die hatte ich mal gefunden, wie man sie simuliert, aber Tasten kann man Garantiert auch simulieren, nur wie...

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Maverick
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mo 05.08.02 00:08 
die funktion heißt keybd_event, hab sie aber noch nie benutzt
Balduin Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 05.08.02 08:18 
whow, die Antworten kamen aber schnell. Vielen Dank !

@MathiasH: Gute Idee. Muss man da die XY-Position der Menuefelder kennen ?

@Maverick: die funktion keybd_event tut ganz gut - nur innerhalb der Delphi-Anwendung. Hätte genau das, aber in einer anderen laufenden Windows-App.


Hoffen auf weitere erleuchtende Stürme des Gehirns :wink: ...

_________________
Balduin
t-ob-i
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 31



BeitragVerfasst: Mo 05.08.02 13:49 
Hallo,

ich stell mal einfach ein paar Beispiele in den Raum.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
 var Buttonhandle: Wnd;
begin
 Buttonhandle := 123456; // Halt ein vernünftiges Handle

 // Entertaste drücken und loslassen
 SendMessage(Buttonhandle, WM_KEYDOWN, VK_RETURN, 0);
 SendMessage(Buttonhandle, WM_KEYUP, VK_RETURN, 0);

 // Doppelklick an Position 100,5 relativ zum Button
 SendMessage(Buttonhandle, WM_LBUTTONDBLCLK,0, MAKELPARAM(100,5) );

 // Einfacher Doppelklick ohne Position
 SendMessage(Buttonhandle, WM_LBUTTONDBLCLK,0, 0); 

 // Linke Maustaste drücken und loslassen
 SendMessage(Buttonhandle, WM_LBUTTONUP, 0 ,0);
 SendMessage(Buttonhandle, WM_LBUTTONDOWN, 0 ,0);

end;


Ich hab das jetzt alles aus der Erinnerung geschrieben deswegen sind mögliche Tippfehler/Erinnerungsfehler vorbehalten :D

Tobias[/code]
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Mo 05.08.02 19:22 
@t-ob-i: ich schätze er muss jetzt auchnoch wissen, wie er an das Handle des MainMenus von Word kommt, da kann ich ihm nämlich nicht helfen, aber du wahrscheinlich oder?

@balduin: ja die musst du kennen, aber auch die kriegst du über das Handle raus.

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
Balduin Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Fr 09.08.02 16:51 
Habe gerade Code aus einem anderen Forim geklaut.

Hoffe das war nicht unseriös !

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:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
procedure MakeWindowActive(wHandle: hWnd);
function GetHandleFromWindowTitle(TitleText: string): hWnd;


implementation

procedure SendKeyString(Text: 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);
begin
  Shift := False;
  for i := 1 to Length(Text) do
    begin
      ch := Text[i];
      if ch >= #250 then
        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 >= #240 then
            c := vk_keys[Ord(ch) - 240]
          else if ch >= #228 then {228 (F1) => $70 (vk_F1)} 
            c := Ord(ch) - 116 
          else if ch < #110 then 
            c := Ord(ch) 
          else
            begin 
              vk := VkKeyScan(ch); 
              c := LoByte(vk); 
            end;
          ScanCode := MapVirtualKey(c, 0); 
          if not Shift and (Hi(vk) > 0then { $2A = scancode of VK_SHIFT }
            Keybd_Event(VK_SHIFT, $2A00); 
          Keybd_Event(c, scancode, 00); 
          Keybd_Event(c, scancode, KEYEVENTF_KEYUP, 0); 
          if not Shift and (Hi(vk) > 0then 
            Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0); 
        end;
    end
end
 
procedure MakeWindowActive(wHandle: hWnd); 
begin 
  if IsIconic(wHandle) then
    ShowWindow(wHandle, SW_RESTORE) 
  else 
    BringWindowToTop(wHandle); 
end
 
function GetHandleFromWindowTitle(TitleText: string): hWnd;
var
  StrBuf: array[0..$FFof Char; 
begin 
  Result := FindWindow(PChar(0), StrPCopy(StrBuf, TitleText)); 
end

procedure SendKeysToTitle(WindowTitle: string; Text: string); 
var 
  Window: hWnd; 
begin
  Window := GetHandleFromWindowTitle(WindowTitle);
  MakeWindowActive(Window);
  SendKeyString(Text);
end;

procedure SendKeysToHandle(WindowHandle: hWnd; Text: string);
begin
  MakeWindowActive(WindowHandle);
  SendKeyString(Text);
end;

end.


Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt

_________________
Balduin