![]() |
Befehle an eine andere Anwendung versenden
Hi,
hab jetzt mehrere stunden lang das inet und dieses forum durchsucht. ich finde aber keine lösung :(
Delphi-Quellcode:
hier wird doch ein tastendruck an das edit geschickt nicht wahr?
SendMessage(Edit1.Handle, WM_KEYDOWN, vkkeyscan('a'), 0);
SendMessage(Edit1.Handle, WM_KEYUP, vkkeyscan('a'), 0); nun lese ich alle aktiven anwendungen in die Combobox und will jetzt gerne an die ausgefählte anwendung diesen einen tastendruck abschicken ich dachte mir, ich hole das handle durch den befehl findwindow, speichere es in eine variable und rufe sendmessage auf, wobei ich nun als handle die neue variable nutze.
Delphi-Quellcode:
das klappt jedoch nicht und mir wird nicht klar warum, vielleicht ists einfach zu spät :)
anwendung:=Name der Anwendung, die durch die combobox ausgesucht wird
var:=findwindow(anwendung,nil); SendMessage(var, WM_KEYDOWN, vkkeyscan('a'), 0); SendMessage(var, WM_KEYUP, vkkeyscan('a'), 0); wäre über hilfe sehr dankbar wie immer. edit: oh nö falsche kathegorie auch noch :(. könnt das jemand vielelciht in programmieren allgemein verschieben? danke! |
Re: Befehle an eine andere Anwendung versenden
var ist ein reserviertes wort
nutze einen anderen namen für die variable |
Re: Befehle an eine andere Anwendung versenden
hi, danke, war schelcht von mir in dem beispiel.
var soll nur eine variable symboliesieren hier nochmal der code:
Delphi-Quellcode:
anwendung ist ein string, der den namen der betroffenen anwendung trägt
procedure TForm1.Timer16Timer(Sender: TObject);
var handle:integer; begin handle:=findwindow(nil, pchar(anwendung)); SendMessage(handle, WM_KEYDOWN, vkkeyscan('a'), 0); SendMessage(handle, WM_KEYUP, vkkeyscan('a'), 0); end; |
Re: Befehle an eine andere Anwendung versenden
Moin Delphi Newbie,
wenn Du eine spezielle Taste drücken willst, würde ich es lieber so schreiben:
Delphi-Quellcode:
bzw.
SendMessage(handle, WM_KEYDOWN, vkkeyscan('a') and $00FF, 0);
Delphi-Quellcode:
Natürlich jeweils auch noch einmal mit WM_KEYUP.
SendMessage(handle, WM_KEYDOWN, ord('A'), 0);
|
Re: Befehle an eine andere Anwendung versenden
hi,
danke erstmal habs mit ord auch schon probiert doch beides funktioniert nciht. gibts da vielelciht einen anderen befehl mit dem ich einen tastendruck an eine application schicken kann? |
Re: Befehle an eine andere Anwendung versenden
@delphi_newbie_123: Wenn alle deine Bemühungen fehlschlagen, könnte es dann nicht sein, das du einfach nur das falsche Handle erwischt hast?
|
Re: Befehle an eine andere Anwendung versenden
nein ich glaube nicht, da bei dem versuch VK_F10 einzusetzen statt ORD('A') sich was im notepad getan hat.
wenn man F10 drückt wird Datei links oben ein bisschen eingedrückt und das war der fall jedesmal wenn man den button gedrückt hat. |
Re: Befehle an eine andere Anwendung versenden
F10 ist dafür reserviert des Menü zu aktivieren. Und da das Menü zum Hauptfenster gehört, ist klar, dass es Funktioniert, wenn du dir das Handle mit FindWindow holst. Das Edit ist aber ein Kindfenster vom Hauptfenster, dass heißt du musst dir erst mit FindWindowEx das handle vom Edit holen. Insofern hat Sprint schon recht, dass du sehr wahrscheinlich das falsche Handle hast.
|
Re: Befehle an eine andere Anwendung versenden
Das Problem bei Notepad wird sein, das du die Tasten an das Hauptfenster sendest und diese Die Tasten nicht an das "Memo" weitergibt... versuch für Notepad mal folgendes
Delphi-Quellcode:
Mit WM_KEYDOWN/UP kommte ich auch nicht in notepad Schreiben obwohl ich das richtige Handle hatte
procedure TForm1.Button1Click(Sender: TObject);
Var hNotepad,hMemo,I:Integer; begin hNotepad:=FindWindow(nil,'Unbenannt - Editor'); If (hNotepad<>0) then begin hMemo:=FindWindowEx(hNotepad,0,'Edit',nil); if hMemo<>0 Then begin For I:=1 to Length(Edit1.Text) do begin SendMessage(hMemo, WM_CHAR, ord(Edit1.text[i]), 0); end; end; end; end; (siehe Abbruchbedingungen) aber mit WM_CHAR (hab ich im SDK gefunden :mrgreen:) landete alles in Notepad so wie ich wollte vllt geht's auch ohne FindWindowEx probier ich auch dann mal aus :) [edit] hab's ohne FindWindowEx getestet .. funktioniert nicht & Luckie war mal wieder schneller als ich :mrgreen: [/edit] |
Re: Befehle an eine andere Anwendung versenden
Moin The-X,
mit der API Funktion GetGUIThreadInfo kann man direkt das Handle des Fenster ermitteln, dass zum einen den Keyboardfokus, und zum anderen das Caret beinhaltet, also ein Eingabefeld ist. Z.B. so:
Delphi-Quellcode:
var
gtiWork : TGUITHREADINFO; if not GetGUIThreadInfo(0,gtiWork) then exit; if (gtiWork.flags and GUI_CARETBLINKING) = 0 then exit; // Kein Caret => Kein Eingabefeld if (gtiWork.hwndCaret = INVALID_HANDLE_VALUE) or // Kein Caret => Kein Eingabefeld (gtiWork.hwndCaret = 0) or // " " (gtiWork.hwndCaret <> gtiWork.hwndFocus) then exit; // Fenster mit Caret hat nicht den Fokus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz