Einzelnen Beitrag anzeigen

Preddy2005

Registriert seit: 27. Nov 2005
Ort: Mettmann
38 Beiträge
 
#1

Problem mit Events bei fremder Anwendung

  Alt 28. Sep 2007, 10:13
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
  Mit Zitat antworten Zitat