![]() |
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 |
Re: Befehle an eine andere Anwendung versenden
Hi,
habe hier grade mal ein bisschen mitgelesen, da ich im moment das selbe problem, nur mit einem editfield und VK_ENTER, habe! funkioniert WM_KEYUP / WM_KEYDOWN nur wenn der fokus auf der anderen application ist? Bei mir weiss ich sicher, das ich das richtige handle habe, weil WM_SETTEXT auch ohne probleme funktioniert. Nur eben das abschicken mit VK_ENTER geht nicht. Habe das auch schon testweise mit calc.exe probiert, aber auch ohne erfolg! Jemand noch eine idee? |
Re: Befehle an eine andere Anwendung versenden
danke euch werd gleich mal testen
|
Re: Befehle an eine andere Anwendung versenden
hi nochmal,
kann man vielleicht simulieren, dass das fenster im vordergrund ist von dem ich das handle habe. in der zeit mit
Delphi-Quellcode:
einen Tastaturdruck senden und dann wieder das alte fenster vorholen ?
PostKeyEx32(Ord('a'), [], False);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:49 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-2025 by Thomas Breitkreuz