![]() |
Re: Application Handle einer fremden Application bekommen?
Hallo
Du könntest es auch über den EXE Namen versuchen sofern der bekannt ist. In der Jedi Library gibt es in der Unit JCLSYSINFO die nötigen Funktionen dazu. 1.ProzessID holen function GetPidFromProcessName(const ProcessName: string): DWORD; 2.Mainwindow handle über die ID suchen. function GetMainAppWndFromPid(PID: DWORD): HWND; Du sollest evt. noch testen ob es sich um ein Fensterhandle handelt. Ist allerdings nicht getestet, sollte aber funktionieren. Sepp |
Re: Application Handle einer fremden Application bekommen?
@Flocke
Also ich hab ne Unit in der die Meldung definiert ist und auf die BEIDE programme zugreifen. Da sollte also nicht das Problem sein. Zitat:
|
Re: Application Handle einer fremden Application bekommen?
Zitat:
Hast du das Ganze denn in der empfangenden Anwendung mal debugged? Oder hast du vielleicht eine Komponente, die Application.OnMessage selbst setzt? |
Re: Application Handle einer fremden Application bekommen?
OK:
Senderprogramm:
Delphi-Quellcode:
In der letzten prozedur(rg_nachricht_steuerClick) wird geBROADCASTet mit der Message WM_SELECTRADIOBUTTON und dem "Übergabewert"
unit USteuer;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Spin, UBotschaften,TlHelp32; type Ttf_steuer = class(TForm) Btn_starten: TButton; Btn_Maximieren: TButton; Btn_Minimieren: TButton; Btn_Button_druecken: TButton; Btn_schliessen: TButton; Btn_wiederherstellen: TButton; rg_nachricht_steuer: TRadioGroup; LHandle: TLabel; LBHandle: TLabel; LRGHandle: TLabel; procedure rg_nachricht_steuerClick(Sender: TObject); procedure Btn_wiederherstellenClick(Sender: TObject); procedure Btn_Button_drueckenClick(Sender: TObject); procedure Btn_MinimierenClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Btn_schliessenClick(Sender: TObject); procedure Btn_MaximierenClick(Sender: TObject); procedure Btn_startenClick(Sender: TObject); private ParentHandle : HWND; ButtonHandle : HWND; RGHandle : HWND; { Private-Deklarationen } public { Public-Deklarationen } end; var tf_steuer: Ttf_steuer; implementation {$R *.dfm} procedure Ttf_steuer.Btn_startenClick(Sender: TObject); var StartupInfo: TStartupinfo; ProcessInfo: TProcessInformation; begin //FUNKTIONIERT!! FillChar(Startupinfo,Sizeof(TStartupinfo),0); Startupinfo.cb:=Sizeof(TStartupInfo); if not CreateProcess(nil,'Empfang.exe',nil,nil,false,normal_priority_class,nil,nil, Startupinfo,ProcessInfo)then ShowMessage('Anwendung konnte nicht gestartet werden'); end; procedure Ttf_steuer.Btn_MaximierenClick(Sender: TObject); begin //FUNKTIONIERT!! ParentHandle:=FindWindow(nil,'Empfang'); LHandle.Caption:=IntToStr(ParentHandle); //Maximieren der Zweiten AW SendMessage(ParentHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0); end; procedure Ttf_steuer.Btn_schliessenClick(Sender: TObject); begin //FUNKTIONIERT!! ParentHandle:=FindWindow(nil,'Empfang'); LHandle.Caption:=IntToStr(ParentHandle); SendMessage(ParentHandle,WM_SYSCOMMAND,SC_CLOSE,0); end; procedure Ttf_steuer.FormClose(Sender: TObject; var Action: TCloseAction); begin Btn_schliessen.Click; end; procedure Ttf_steuer.Btn_MinimierenClick(Sender: TObject); begin //FUNKTIONIERT!! ParentHandle:=FindWindow(nil,'Empfang'); LHandle.Caption:=IntToStr(ParentHandle); //Minimieren der zweiten AW SendMessage(ParentHandle, WM_SYSCOMMAND, SC_MINIMIZE, 0); end; procedure Ttf_steuer.Btn_Button_drueckenClick(Sender: TObject); begin //FUNKTIONIERT!! ParentHandle:=FindWindow(nil,'Empfang'); ButtonHandle:=FindWindowEx(ParentHandle, 0,'TButton',nil); LBHandle.Caption:=IntToStr(ButtonHandle); //Button der zweiten AW betätigen SendMessage(ButtonHandle, BM_CLICK, 0, 0); end; procedure Ttf_steuer.Btn_wiederherstellenClick(Sender: TObject); begin ParentHandle:=FindWindow(nil,'Empfang'); LHandle.Caption:=IntToStr(ParentHandle); //Wiederherstellen der zweiten AW ShowWindow(ParentHandle,1); end; procedure Ttf_steuer.rg_nachricht_steuerClick(Sender: TObject); begin ParentHandle:=FindWindow(nil,'Empfang'); PostMessage(HWND_BROADCAST,WM_SELECTRADIOBUTTON,rg_nachricht_steuer.ItemIndex,0); end; end. rg_nachricht_steuer.ItemIndex(Radiogroup) Unit mit der Konstanten
Delphi-Quellcode:
hier ist die Message als Konstante Deklariert auf welche Sender und Empfänger zugreifen.
unit UBotschaften;
interface uses Messages; const WM_SELECTRADIOBUTTON = (WM_USER+5); WM_GETAPPHANDLE = (WM_USER+6); implementation end. Empfängerprogramm
Delphi-Quellcode:
Dem Empfänger wird im FormCreate der Application.OnMessage Die prozedur SelectRadioButton zugewiesen,
unit UEmpfang;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls ,UBotschaften; type Ttf_empfang = class(TForm) Btn_Empfang: TButton; rg_nachricht: TRadioGroup; LHandle: TLabel; LBHandle: TLabel; LRGHandle: TLabel; procedure FormCreate(Sender: TObject); procedure Btn_EmpfangClick(Sender: TObject); private { Private-Deklarationen } protected procedure SelectRadioButton(var Msg: TMsg; var Handeled: boolean); // procedure XX(var msg: TMessage); message WM_SELECTRADIOBUTTON; public { Public-Deklarationen } end; var tf_empfang: Ttf_empfang; implementation {$R *.dfm} procedure Ttf_empfang.SelectRadioButton(var Msg : TMsg; var Handeled : boolean); begin case Msg.message of WM_SELECTRADIOBUTTON : begin beep; rg_nachricht.ItemIndex:=Msg.wParam; end; end; end; procedure Ttf_empfang.Btn_EmpfangClick(Sender: TObject); begin case rg_Nachricht.ItemIndex of 0:ShowMessage('Nachricht EINS ausgewählt'); 1:ShowMessage('Nachricht ZWEI ausgewählt'); 2:ShowMessage('Nachricht DREI ausgewählt'); 3:ShowMessage('Nachricht VIER ausgewählt'); 4:ShowMessage('Nachricht FÜNF ausgewählt'); end; end; procedure Ttf_empfang.FormCreate(Sender: TObject); begin Application.OnMessage:=SelectRadioButton; end; {procedure Ttf_empfang.XX(var msg: TMessage); begin rg_nachricht.ItemIndex:=msg.WParam; end; } end. in welcher auf die gesendete Message abgefragt wird und bei der Bestätigung eben eine Nachricht angezeigt werden sollte. Aber aus irgendwelchen Gründen funktioniert es nicht. Sag mir einfach wo hier mein Denkfehler liegt: mit der Prozedur XX im Empfänger funktioniert es. Ohne, d.h. mit der Zuweisung an Application.OnMessage funktioniert es nicht, was es aber sollte.Warum? |
Re: Application Handle einer fremden Application bekommen?
Vorab: wie ich schon zwei Mal geschrieben habe, solltest du keine selbsterdachten Meldungsnummern broadcasten. Zur Verdeutlichung:
Delphi-Quellcode:
Weiter:
// Ausgedachte Nummer
const WM_SELECTRADIOBUTTON = (WM_USER+5); // Systemweit eindeutige Nummer var WM_SELECTRADIOBUTTON; // ... zur Initialisierung: WM_SELECTRADIOBUTTON := RegisterWindowMessage('WM_SELECTRADIOBUTTON'); eine direkten Fehler kann ich nicht entdecken, bis auf die Ausnahme, dass du in SelectRadioButton nicht auf das Handle der Anwendung bzw. des Hauptfensters prüfst. Nebenbei: Application.Handle ist auch ein Fensterhandle (sonst könnte man ja keine Nachrichten dort hin schicken), nur eben das des (unsichtbaren) Anwendungsfensters, dessen Titel in der Taskleiste eingeblendet wird. Das sollte deine Anwendung aber nicht daran hindern, einen Piepton auszugeben. Ist das denn genau der Fehler, dass in SelectRadioButton keine Nachrichten ankommen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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