AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Desktop anzeigen (ToggleDesktop) - Wie ignorieren?
Thema durchsuchen
Ansicht
Themen-Optionen

Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

Offene Frage von "holliesoft"
Ein Thema von holliesoft · begonnen am 24. Jan 2007 · letzter Beitrag vom 25. Jan 2007
Antwort Antwort
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#1

Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 24. Jan 2007, 14:06
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 24. Jan 2007, 14:37
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
  Mit Zitat antworten Zitat
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 24. Jan 2007, 15:21
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 24. Jan 2007, 17:25
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
  Mit Zitat antworten Zitat
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 24. Jan 2007, 18:47
Hi Stahli,

danke erstmal, ich werde damit mal rumprobieren...

Schönen Abend noch,
Patrick
  Mit Zitat antworten Zitat
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 25. Jan 2007, 05:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 25. Jan 2007, 07:46
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
  Mit Zitat antworten Zitat
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 25. Jan 2007, 09:17
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
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 25. Jan 2007, 09:56
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
  Mit Zitat antworten Zitat
Benutzerbild von holliesoft
holliesoft

Registriert seit: 4. Apr 2005
Ort: Gau-Algesheim
250 Beiträge
 
FreePascal / Lazarus
 
#10

Re: Desktop anzeigen (ToggleDesktop) - Wie ignorieren?

  Alt 25. Jan 2007, 10:06
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:15 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