Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Desktop anzeigen (ToggleDesktop) - Wie ignorieren? (https://www.delphipraxis.net/84999-desktop-anzeigen-toggledesktop-wie-ignorieren.html)

holliesoft 24. Jan 2007 14:06


Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo,

ich habe ein Post-It-Programm geschrieben (http://www.klebezettel.net) und habe das Problem, dass beim Aufruf der Windows-Funktion "Desktop anzeigen" (WIN + D) meine Notiz-Fenster leider auch ausgeblendet werden. Nun habe ich leider bisher erfolglos nach einer Lösung gesucht, wie ich das vermeide, denn die Anwender meiner Software erwarten, dass die Notizen bei "Desktop anzeigen" noch auf dem Desktop zu sehen sind.
Was macht diese Funktion? Ich dachte zunächst, dass die Fenster minimiert werden. Dies scheint jedoch nicht der Fall zu sein. Dann dachte ich vielleicht, dass SHOWWINDOW mit SW_HIDE geschickt wird, dies scheint jedoch auch nicht der Fall zu sein. Weiß jemand, auf welche spezielle Nachricht hier reagiert werden muß?

Gruß
Patrick

stahli 24. Jan 2007 14:37

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo hollisoft,

ich habe schnell mal herumprobiert:

Delphi-Quellcode:
procedure TFormTest.FormActivate(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'1'
end;

procedure TFormTest.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
sysutils.beep;
caption:=caption+'2'
end;

procedure TFormTest.FormClick(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'3'
end;

procedure TFormTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
sysutils.beep;
caption:=caption+'4'
end;

procedure TFormTest.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
sysutils.beep;
caption:=caption+'5'
end;

procedure TFormTest.FormConstrainedResize(Sender: TObject; var MinWidth,
  MinHeight, MaxWidth, MaxHeight: Integer);
begin
sysutils.beep;
caption:=caption+'6'
end;

procedure TFormTest.FormContextPopup(Sender: TObject; MousePos: TPoint;
  var Handled: Boolean);
begin
sysutils.beep;
caption:=caption+'7'
end;

procedure TFormTest.FormCreate(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'8'
end;

procedure TFormTest.FormDblClick(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'9'
end;

procedure TFormTest.FormDeactivate(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'0'
end;

procedure TFormTest.FormDestroy(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'a'
end;

procedure TFormTest.FormDockDrop(Sender: TObject; Source: TDragDockObject;
  X, Y: Integer);
begin
sysutils.beep;
caption:=caption+'b'
end;

procedure TFormTest.FormDockOver(Sender: TObject; Source: TDragDockObject;
  X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
sysutils.beep;
caption:=caption+'c'
end;

procedure TFormTest.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
sysutils.beep;
caption:=caption+'d'
end;

procedure TFormTest.FormDragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
sysutils.beep;
caption:=caption+'e'
end;

procedure TFormTest.FormGetSiteInfo(Sender: TObject; DockClient: TControl;
  var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean);
begin
sysutils.beep;
caption:=caption+'f'
end;

function TFormTest.FormHelp(Command: Word; Data: Integer;
  var CallHelp: Boolean): Boolean;
begin
sysutils.beep;
caption:=caption+'g'
end;

procedure TFormTest.FormHide(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'h'
end;

procedure TFormTest.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
sysutils.beep;
caption:=caption+'i'
end;

procedure TFormTest.FormKeyPress(Sender: TObject; var Key: Char);
begin
sysutils.beep;
caption:=caption+'j'
end;

procedure TFormTest.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
sysutils.beep;
caption:=caption+'k'
end;

procedure TFormTest.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
sysutils.beep;
caption:=caption+'l'
end;

procedure TFormTest.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
sysutils.beep;
caption:=caption+'m'
end;

procedure TFormTest.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
sysutils.beep;
caption:=caption+'n'
end;

procedure TFormTest.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
sysutils.beep;
caption:=caption+'o'
end;

procedure TFormTest.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
sysutils.beep;
caption:=caption+'p'
end;

procedure TFormTest.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
sysutils.beep;
caption:=caption+'q'
end;

procedure TFormTest.FormPaint(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'r'
end;

procedure TFormTest.FormResize(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'s'
end;

procedure TFormTest.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
sysutils.beep;
caption:=caption+'t'
end;

procedure TFormTest.FormShow(Sender: TObject);
begin
sysutils.beep;
caption:=caption+'u'
end;

procedure TFormTest.FormStartDock(Sender: TObject;
  var DragObject: TDragDockObject);
begin
sysutils.beep;
caption:=caption+'v'
end;

procedure TFormTest.FormUnDock(Sender: TObject; Client: TControl;
  NewTarget: TWinControl; var Allow: Boolean);
begin
sysutils.beep;
caption:=caption+'w'
end;
Demnach wird beim Drücken der Win-Taste FormShortCut(var Msg: TWMKey; var Handled: Boolean);
aufgerufen. Vermutlich musst Du die Ereignisbehandlung dann abbrechen oder z.B. danach per Timer Show aufrufen...


Stahli

holliesoft 24. Jan 2007 15:21

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hi Stahli,

danke erstmal für Deine Antwort und Deinen ausführlichen Test. Allerdings bringt mich das nun auch nicht viel weiter, denn...

1. Wenn meine Anwendung nicht aktiv ist (d.h. eine andere Anwendung hat den Focus) wird bei WIN + D kein Event generiert
2. Wenn der Anwender (und so machen es die meisten, die ich kenne) die Funktion "Desktop anzeigen" benutzen, dann wird ja kein Tastaturereignis erzeugt, sondern das ToggleDesktop-Kommando der explorer.exe aufgerufen. Wenn ich nur wüsste, was ToggleDesktop für "Schweinereien" mit den Anwendungen anstellt... :-(

Gruß,
Patrick

stahli 24. Jan 2007 17:25

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo hollisoft,

jetzt hab ich mich da ein bischen festgebissen... ;-)

Delphi-Quellcode:
procedure WMShowWindow(var Message: TWMShowWindow); message WM_SHOWWINDOW;

...

procedure TFormTest.WMShowWindow(var Message: TWMShowWindow);
const
  ShowCommands: array[saRestore..saMaximize] of Integer =
    (SW_SHOWNOACTIVATE, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED);
begin
  sysutils.Beep;
  inherited;
{
  with Message do
    case Status of
      SW_PARENTCLOSING:
        begin
          if IsIconic(Handle) then FShowAction := saMinimize else
            if IsZoomed(Handle) then FShowAction := saMaximize else
              FShowAction := saRestore;
          inherited;
        end;
      SW_PARENTOPENING:
        if FShowAction <> saIgnore then
        begin
          ShowWindow(Handle, ShowCommands[FShowAction]);
          FShowAction := saIgnore;
        end;
    else
      inherited;
    end;
}
end;
Jetzt klingelt das Formular auch wenn es nicht fokussiert ist und man das Desktop-Icon in der Taskbar anklickt (das meintest Du sicher!?)

Ich kann jetzt aber nicht sagen, wie Du die Ereignisbehandlung dann unterdrücken kannst. Die Notlösung über Timer starten und Formular wiederherstellen sollte aber irgendwie gehen...


Stahli

holliesoft 24. Jan 2007 18:47

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hi Stahli,

danke erstmal, ich werde damit mal rumprobieren...

Schönen Abend noch,
Patrick

holliesoft 25. Jan 2007 05:33

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo und guten Morgen,

leider klappt das nicht so, wie ich mir erhofft hatte. In einem neuen, leeren Projekt mit einer Form klappt es, d.h. mit dem Beispiel-Code wird Sysutils.Beep aufgerufen. Wenn ich den Beispielcode dagegen in meine bestehende Anwendung einbaue, dann bleibt der Rechner dagegen leider stumm :-(
Vielleicht sollte ich noch was zum grundgelenden Aufbau meines Programms schreiben:
Die Mainform, die auch als Start-Splashscreen verwendet wird, ist mit Application.ShowMainform := false ausgeblendet. Zusätzlich blende ich den Taskbareintrag aus:

Delphi-Quellcode:
procedure TStart.EntferneEintragAusDerTaskbar;
var
  Owner: THandle;
begin
  owner := GetWindow(Handle, GW_OWNER);
  ShowWindow(Owner, SW_Show);
  ShowWindow(Owner, SW_HIDE);
end;
Auf der Mainform liegt auch eine TJvTrayicon-Komponente, um ein Trayicon anzuzeigen.
Die "Post-It"-Fenster meiner Anwendung sind Instanzen von Form2, für jede angelegte Notiz gibt es eine Instanz dieses Formulares.
Ich habe nun festgestellt, dass die Notiz-Fenster nicht verschwinden, wenn sie auf StayOnTop gesetzt sind. Aber das bringt mich auch nicht wirklich weiter, ich weiß immer noch nicht, wie ich meine Anwendung davor bewahren kann, vom Desktop zu verschwinden. :-( Hat sonst jemand eine Idee?

Danke und Gruß
Patrick

Mavarik 25. Jan 2007 07:46

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo!

Ich habe zwar keine Lösung daher vielleicht etwas OT aber...

Wenn ich auf das Icon "Desktop zeigen" klicke, gibt es dafür "nur" einen Grund,
ich will an die Icons, die auf dem Desktop liegen, oder?

Wenn also ein Programm sich trotzdem wieder "Drübermatscht" würde mich das tierisch annerven...

Liegt vielleicht aber auch daran, das mein Desktop voll mit Icons ist...

Grüsse Frank :coder:

holliesoft 25. Jan 2007 09:17

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo Frank,

es geht ja darum, dass die Anwender meines Tools erwarten, dass die Notiz-Fenster auf dem Desktop angezeigt werden, auch wenn die Funktion "Desktop anzeigen" benutzt wird. Zudem würde ich das Verhalten dann auch nur ändern, wenn es der Anwender selbst in den Programmeinstellungen meines Tools so einstellt.

Gruß
Patrick

stahli 25. Jan 2007 09:56

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hallo Patrick,

Zitat:

Die "Post-It"-Fenster meiner Anwendung sind Instanzen von Form2, für jede angelegte Notiz gibt es eine Instanz dieses Formulares.
Ich habe nun festgestellt, dass die Notiz-Fenster nicht verschwinden, wenn sie auf StayOnTop gesetzt sind. Aber das bringt mich auch nicht wirklich weiter, ich weiß immer noch nicht, wie ich meine Anwendung davor bewahren kann, vom Desktop zu verschwinden.
Ich verstehe das noch nicht ganz. Die Post-Its verschwinden nicht? Die Hauptanwendung aber doch?
Sogar der Taskmanager verschwindet doch, wenn man den Desktop anzeigen lässt. Und der ist ja auch StayOnTop, denke ich.

Hast Du die Ereignisbehandlung mal in beiden Formularen ausprobiert?

Stahli

holliesoft 25. Jan 2007 10:06

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
 
Hi Stahli,

die Post-Its verschwinden, wenn sie nicht StayOnTop sind. Sind sie aber StayOnTop, dann verschwinden sie nicht. Hab noch 2 andere Anwendungen von mir, die auf meiner Arbeit eingesetzt werden,Ha beide sind StayOnTop und verschwinden nicht bei "Desktop anzeigen".
Ich hab sowohl im Hauptformular als auch in den Notiz-Fenstern die Ereignisbehandlung ausprobiert, ohne Erfolg.
Hängt das ganze vielleicht sogar mit diesem "unsichtbaren" Fenster zusammen, das bei VCL-Anwendungen vorhanden ist?
Hat vielleicht einer der Non-VCL-Experten eine Idee?

Gruß,
Patrick


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 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