Seite 1 von 2

Fenster nicht in der Taskleiste anzeigen

Verfasst: 22.03.2007 20:25
von Olaf
Beim Fenster "Program Manager" der Klasse "Progman"
handelt es sich um den "echten" Desktop, also das Fenster,
auf dem sich der ganze Desktop (außer Taskleiste) befindet.
Das Handle erhält man daher durch

Code: Alles auswählen

Define.l hDesktop
hDesktop=FindWindow_("Progman","Program Manager")
Nun ist es so, dass die ChildWindows des Desktops nicht in der Taskleiste angezeigt werden.
Daher bietet sich eine relativ einfache Möglichkeit Fenster nicht in der Taskleiste anzeigen zu lassen:
einfach als ChildWindows des Desktops erstellen:
Beispiel:

Code: Alles auswählen

Define.l hWnd,event,Close
hWnd=OpenWindow(0,0,0,400,300,"none",#WS_POPUPWINDOW|#PB_Window_WindowCentered,hDesktop)
  CreateGadgetList(hWnd)
    ButtonImageGadget(0,0,0,32,32,9)
Repeat
  event=WaitWindowEvent()
  Select event
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          Close=1
      EndSelect
  EndSelect
Until Close=1
Dieser Effekt ist z.B. nützlich für Startpopups (wie z.B. bei OpenOffice oder 1&1 SoftPhone).
Außerdem werden die so maskierten Fenster auch nicht im Taskmanager angezeigt.

Verfasst: 22.03.2007 20:44
von ts-soft
Man kann aber auch ein Fenster invisible erstellen, sowie ein zweites als
Parent, so taucht es auch nicht auf.

Die IMHO richtige Methode ist folgende:

Code: Alles auswählen

Procedure HideFromTaskBar(hWnd.l, Flag.l)
  Protected TBL.ITaskbarList

  CoInitialize_(0)
  If CoCreateInstance_(?CLSID_TaskBarList, 0, 1, ?IID_ITaskBarList, @TBL) = #S_OK
    TBL\HrInit()
    If Flag
      TBL\DeleteTab(hWnd)
    Else
      TBL\AddTab(hWnd)
    EndIf
    TBL\Release()
  EndIf
  CoUninitialize_()
 
  DataSection
    CLSID_TaskBarList:
    Data.l $56FDF344
    Data.w $FD6D, $11D0
    Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
    IID_ITaskBarList:
    Data.l $56FDF342
    Data.w $FD6D, $11D0
    Data.b $95, $8A, $00, $60, $97, $C9, $A0, $90
  EndDataSection
EndProcedure

Verfasst: 22.03.2007 21:04
von Olaf
@ts-soft:
Ja...so geht's natürlich auch. Ist auch "richtiger", aber ich hab den Code ja gepostet, weil er relativ "bequem" ist. Quasi als Alternative.

Verfasst: 22.03.2007 21:06
von ts-soft
Ich wollte es auch nur vervollständigen :D

Verfasst: 22.03.2007 22:57
von Alves
Werden Childwindows nicht automatisch geschlossen, wenn das Parentwindow geschlossen wird?

Ich frage, weil ich zB öfter mal die explorer.exe, die ja den Desktop erzeugt, gerne mal abschieße, somit wäre das Fenster auch weg.

Verfasst: 22.03.2007 23:08
von ts-soft
Alves hat geschrieben:Werden Childwindows nicht automatisch geschlossen, wenn das Parentwindow geschlossen wird?
Warum testest Du es nicht selber? Ich werde meinen Explorer zwecks Test
nicht abschiessen :mrgreen: Normallerweise ist das so, aber obs beim
Explorer normal ist, bzw. sind Explorer und Progman nicht unterschiedliche
Dateien
Alves hat geschrieben: Ich frage, weil ich zB öfter mal die explorer.exe, die ja den Desktop erzeugt, gerne mal abschieße, somit wäre das Fenster auch weg.
Warum machste das :freak:

Verfasst: 22.03.2007 23:11
von Alves
Weil der explorer am meisten ram von allen programen verbraucht und der rechner ohne besser läuft.

hab jetzt grad keinen code zum testen mit parentwindows, wenn du einen hast, teste ich es gerne.

Verfasst: 22.03.2007 23:22
von ts-soft
>> hab jetzt grad keinen code zum testen mit parentwindows, wenn du einen hast, teste ich es gerne.
Äuglein auf :D
Siehe erstes Posting, die oberen 2 Zeilen und den restlichen Source in die
IDE kopieren :mrgreen:

Verfasst: 22.03.2007 23:24
von Alves
oh hehe^^

danke

Verfasst: 29.05.2007 00:18
von pjanfred
Alves hat geschrieben:Werden Childwindows nicht automatisch geschlossen, wenn das Parentwindow geschlossen wird?

Ich frage, weil ich zB öfter mal die explorer.exe, die ja den Desktop erzeugt, gerne mal abschieße, somit wäre das Fenster auch weg.
Vollständigkeits halber:

Nein das Fenster bleibt erhalten!!!