Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programm in den Vordergrund bringen (https://www.delphipraxis.net/72219-programm-den-vordergrund-bringen.html)

bonanza 27. Jun 2006 10:35


Programm in den Vordergrund bringen
 
HI,

ich möchte mein Programm, wenn ein bestimmter fall eintritt, in den Vordergrund bringen. Wie kann ich das machen ?

ich hab schon danach gegoogelt habe nur "alte" methoden gefunden, die bei mir nicht funktionieren, da ich XP habe.

Vielen dank schonmal im voraus.

Obi-Wan 27. Jun 2006 10:46

Re: Programm in den Vordergrund bringen
 
Ich würds einfach so machen:

Delphi-Quellcode:
procedure MeinEreignis;
begin
 FormStyle := fsStayOnTop; //Form in den "StayOnTop" Modus bringen
 FormStyle := fsNormal; //Form wieder "normalisieren"
end;
Gibt vielleicht noch ne elegantere Methode die mich auch interressieren würde ^^

bonanza 27. Jun 2006 10:50

Re: Programm in den Vordergrund bringen
 
und wie kann ich es verbergen, also, dass das Form nicht mehr zu sehen ist (habe es schon in Tray gebracht)?

TheAn00bis 27. Jun 2006 10:52

Re: Programm in den Vordergrund bringen
 
Auch TApplication kennt

Delphi-Quellcode:
BringToFront;
,

wenn ich mich denn nicht irre.

Edit:
Zitat:

Zitat von bonanza
und wie kann ich es verbergen, also, dass das Form nicht mehr zu sehen ist (habe es schon in Tray gebracht)?

Delphi-Quellcode:
form1.visible := false
?

Luckie 27. Jun 2006 10:53

Re: Programm in den Vordergrund bringen
 
Zitat:

Zitat von Obi-Wan
Ich würds einfach so machen:

Und ich nicht, denn:
Zitat:

Note: It is not advisable to change FormStyle at runtime.
Grund ist der, dass das Formular neu erzeugt wird und somit ein neues Handle bekommt, was ungewollte Nebeneffekte zur Folge haben kann. Nimm besser MSDN-Library durchsuchenSetWindowPos mit dem Flag HWND_TOPMOST.

Verbergen geht mit der Eigenschaft Delphi-Referenz durchsuchenHide von TForm.

bonanza 27. Jun 2006 11:03

Re: Programm in den Vordergrund bringen
 
könntest du mir dafür ein beispiel geben ?

ich weiß nämlich nicht, wie ich das mit den "uFlags" machen soll:

Delphi-Quellcode:
SetWindowPos(HWND,HWND_TOPMOST,0,0,0,0,UINT uFlags);
?

Luckie 27. Jun 2006 11:24

Re: Programm in den Vordergrund bringen
 
Sthet doch alles im PSDK: http://msdn.microsoft.com/library/de...twindowpos.asp

NicoDE 27. Jun 2006 11:28

Re: Programm in den Vordergrund bringen
 
Ansonsten kannst du dir das Vordergrundfenster holen (GetForegroundWindow), die Eingabequeues verbinden (GetWindowThreadProcessId, AttachThreadInput) und mittels (Windows.)SetFocus dein Programm aktivieren.

Delphi-Quellcode:
function BringToFrontEx(AWnd: HWND): Boolean;
var
  FgWindow: HWND;
  ThreadId: DWORD;
  Attached: BOOL;
begin
  FgWindow := GetForegroundWindow();
  ThreadId := GetWindowThreadProcessId(FgWindow, nil);
  Attached := AttachThreadInput(GetCurrentThreadId(), ThreadId, True);
  if Attached or (ThreadId = GetCurrentThreadId()) then
    Result := SetFocus(AWnd) <> 0
  else
    Result := SetForegroundWindow(AWnd);
  if Attached then
    AttachThreadInput(GetCurrentThreadId(), ThreadId, False);
end;
Wenn dein Programm sich ohne Grund den Fokus holt, wird der Benutzer es schnell hassen lernen...

Obi-Wan 27. Jun 2006 11:57

Re: Programm in den Vordergrund bringen
 
Achso ok, danke Luckie für die Aufklärung :)
Habs halt mit bringToFront versucht aber das funktioniert leider nicht :(

bonanza 27. Jun 2006 14:29

Re: Programm in den Vordergrund bringen
 
Ich hab das Porgramm jetzt versteckt mit:

Delphi-Quellcode:
ShowWindow(Handle, SW_HIDE);
ShowWindow(Application.Handle, SW_HIDE);

aber wie kann ich es wieder anzeigen ?

ManuMF 27. Jun 2006 14:50

Re: Programm in den Vordergrund bringen
 
Hallo,

in dem du statt SW_HIDE SW_SHOW verwendest.

Gruß,
ManuMF

bonanza 27. Jun 2006 14:53

Re: Programm in den Vordergrund bringen
 
danke...ich habs mit
Delphi-Quellcode:
ShowWindow(Handle, SW_SHOWNORMAL);
probiert, funktioniert auch, aber wenn ich es in dieser Procedure (von dsdt) verwende funktioniert es nicht:

Delphi-Quellcode:
procedure TaskBarRemoveIcon;
var
  tnid: TNotifyIconData;
  Owner: HWnd;
begin
  tnid.cbSize := SizeOf(TNotifyIconData);
  tnid.Wnd := Form1.Handle;
  tnid.uID := 1;
  Shell_NotifyIcon(NIM_DELETE, @tnid);
   Owner:=GetWindow(Form1.Handle,GW_OWNER);
  If Owner<>0 Then Begin
    ShowWindow(Handle, SW_SHOWNORMAL); //<<--- er sagt: [Error] Unit1.pas(76): Undeclared identifier: 'Handle'
    ShowWindow(Owner,SW_Show);
    ShowWindow(Owner,SW_Normal);
  End;
end;
woran liegt das, dass es in der einen procedure funktioniert, in dieser aber nicht ? kriegt er da das Handle nicht ?



Danke hat sich schon erledigt, ich hab einfach das Handle des letzten aufrufes (sw_hide) in einer variable gespeichert und oben verwendet.

ManuMF 27. Jun 2006 14:57

Re: Programm in den Vordergrund bringen
 
Hallo,

in der anderen Procedure steht Handle für das Handle von Form1 ( :arrow: procedure TForm1.XYZ). In der anderen Procedure gibt es aber nichts, wozu handle gehören könnte ( :arrow: Undefinierter Bezeichner). Schreibe also einfach ein "Form1." davor, und es funktioniert.

Gruß,
ManuMF


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz