Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Befehle an eine andere Anwendung versenden (https://www.delphipraxis.net/35223-befehle-eine-andere-anwendung-versenden.html)

delphi_newbie_123 4. Dez 2004 00:06


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:
SendMessage(Edit1.Handle, WM_KEYDOWN, vkkeyscan('a'), 0);
SendMessage(Edit1.Handle, WM_KEYUP, vkkeyscan('a'), 0);
hier wird doch ein tastendruck an das edit geschickt nicht wahr?

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:
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);
das klappt jedoch nicht und mir wird nicht klar warum, vielleicht ists einfach zu spät :)
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!

supermuckl 4. Dez 2004 00:15

Re: Befehle an eine andere Anwendung versenden
 
var ist ein reserviertes wort

nutze einen anderen namen für die variable

delphi_newbie_123 4. Dez 2004 00:17

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:
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;
anwendung ist ein string, der den namen der betroffenen anwendung trägt

Christian Seehase 4. Dez 2004 00:27

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:
SendMessage(handle, WM_KEYDOWN, vkkeyscan('a') and $00FF, 0);
bzw.

Delphi-Quellcode:
SendMessage(handle, WM_KEYDOWN, ord('A'), 0);
Natürlich jeweils auch noch einmal mit WM_KEYUP.

delphi_newbie_123 4. Dez 2004 00:34

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?

Sprint 4. Dez 2004 00:41

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?

delphi_newbie_123 4. Dez 2004 00:47

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.

Luckie 4. Dez 2004 01:32

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.

The-X 4. Dez 2004 01:40

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:
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;
Mit WM_KEYDOWN/UP kommte ich auch nicht in notepad Schreiben obwohl ich das richtige Handle hatte
(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]

Christian Seehase 4. Dez 2004 02:18

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

ghost 4. Dez 2004 06:15

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?

delphi_newbie_123 4. Dez 2004 11:33

Re: Befehle an eine andere Anwendung versenden
 
danke euch werd gleich mal testen

delphi_newbie_123 4. Dez 2004 15:45

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:
PostKeyEx32(Ord('a'), [], False);
einen Tastaturdruck senden und dann wieder das alte fenster vorholen ?


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