Hallo zusammen,
ich benötige Hilfe in Bezug auf die Verarbeitung oder besser gesagt die Verwendung von Windows Messages.
Und zwar habe ich folgendes Problem:
An ein fremedes Fenster wird aus meiner Anwendung ein Wert übergeben und je nach Zustand wird dieses Fenster halt minimiert oder in den Vordergrund geholt.
Hier mal etwas Code :
Delphi-Quellcode:
// Wir senden Text an das Programm
SendMessage(h_Edit, WM_SETTEXT, 0, Integer(PChar(objnr)));
SendMessage(h_Edit, WM_LBUTTONDOWN, MK_LBUTTON, 0);
SendMessage(h_Edit_Klick, WM_LBUTTONUP, MK_LBUTTON, 0);
SendMessage(h_Edit_Klick, WM_LBUTTONDOWN, MK_LBUTTON, 0);
SendMessage(h_Edit_Klick, WM_LBUTTONUP, MK_LBUTTON, 0);
Hole_Fenster_in_den_Vordergrund('xxx.exe');
In einer anderen
Unit verwende ich die Prozeduren, welche die Funktionalität von Hole_Fenster_in_den_Vordergrund abbilden.
Delphi-Quellcode:
// Verbesserte Version von SetForeGroundWindow
procedure ForceForegroundWindow(hwnd: THandle);
// (W) 2001 Daniel Rolf
// [url]http://www.finecode.de[/url]
// [email]rolf@finecode.de[/email]
var
hlp: TForm;
begin
hlp := TForm.Create(
nil);
try
hlp.BorderStyle := bsNone;
hlp.SetBounds(0, 0, 1, 1);
hlp.FormStyle := fsStayOnTop;
hlp.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE
or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE
or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hwnd);
finally
hlp.Free;
end;
end;
Delphi-Quellcode:
// Holt das Fenster in den Vordergrund via SW_Restore oder zeigt es an onTop an
procedure Hole_Fenster_in_den_Vordergrund ( Programmname :
String);
var h_Prog : hwnd;
begin
// Funktion holt Fenster in den Vordergrund
h_Prog := FindWindowByTitle(Programmname);
if (h_Prog <> 0)
then
begin
h_Prog := GetWindow(h_Prog, GW_OWNER);
// Owner-Handle holen (Handle des TApplication-Fensters)
if IsIconic(h_Prog)
then
ShowWindow(h_Prog, SW_RESTORE);
// restoren wenn minimiert
// Hauptfenster in den Vordergrund holen
ForceForegroundWindow(h_Prog);
BringWindowToTop(h_Prog);
end;
end;
Nun mein Problem :
Wenn ich das Fenster aus dem IsIconic-Zustand via SW_Restore zurückhole, funktioniert alles tadellos.
Ist das Fenster dagegen sichtbar auf dem Desktop, dann wird es angezeigt und ich muss um das Fenster zu minimieren oder beenden,
doppelt auf den jeweiligen Button drücken.
Welche Windows - Message bzw. Notification benötige ich noch, damit ich zum minimieren oder beenden nur noch einmal den Button drücken muss? Oder liegt das Problem an einer anderen Stelle?
Vielen Dank im vorraus für eure Hilfe,
Gruß
Matthias