Delphi-PRAXiS
Seite 1 von 2  1 2      

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 01: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 01: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 01: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 01: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 01: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 01: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 01: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 02: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 02: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 03: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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 Uhr.
Seite 1 von 2  1 2      

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