Autor |
Beitrag |
Balduin
Hält's aus hier
Beiträge: 8
|
Verfasst: So 04.08.02 17:13
 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
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: 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
      
Beiträge: 18
|
Verfasst: Mo 05.08.02 00:08
die funktion heißt keybd_event, hab sie aber noch nie benutzt
|
|
Balduin 
Hält's aus hier
Beiträge: 8
|
Verfasst: 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  ...
_________________ Balduin
|
|
t-ob-i
      
Beiträge: 31
|
Verfasst: Mo 05.08.02 13:49
Hallo,
ich stell mal einfach ein paar Beispiele in den Raum.
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
Tobias[/code]
|
|
MathiasH
      
Beiträge: 699
WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
|
Verfasst: 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 
Hält's aus hier
Beiträge: 8
|
Verfasst: Fr 09.08.02 16:51
Habe gerade Code aus einem anderen Forim geklaut.
Hoffe das war nicht unseriös !
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..9] of 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..2] of 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 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) > 0) then Keybd_Event(VK_SHIFT, $2A, 0, 0); Keybd_Event(c, scancode, 0, 0); Keybd_Event(c, scancode, KEYEVENTF_KEYUP, 0); if not Shift and (Hi(vk) > 0) then 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..$FF] of 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 Martok: Code- durch Delphi-Tags ersetzt
_________________ Balduin
|
|
|