Taskbar Button



  • Hi,
    ich habe mit Hilfe von COM (ITaskbarList) den Button des Fensters unten aus der Taskbar entfernt. Ich kann normal weiterarbeiten und das Fenster auch minimieren. Will ich es allerdings wiederherstellen, so erscheint der Button wieder in der Taskbar (was nicht gewollt ist). Es soll eigentlich erst duch Aufruf der entsprechenden AddTab Funktion wieder ein Button erscheinen.
    U.a. zwei Funktionen sind für dieses Verhalten verantwortlich:
    ShowWindow(hWnd, SW_SHOWNORMAL) und SetForegroundWindow(hWnd).
    Beide ruf ich auf und bei beiden erscheint sogleich der Button wieder in der Taskbar ( SetForegroundWindow() rufe ich wegen einem Popup Menu auf, das Fenster wird dabei sogar nichtmal maximiert).

    Hat jemand eine Idee, woran das liegen koennte? Ich kann mir nicht vorstellen, dass das so gewollt ist. Dann haette die COM Funktion ja quasi wenig Sinn, wenn das bei jedem Maximieren/Wiederherstellen o.ä. sowieso überschrieben wird.

    Hoffe mir kann jemand helfen

    Gruss,
    DeSoVoDaMu



  • Geht das nicht auch ohne COM? Das Problem wurde hier schon einige Male erfolgreich besprochen (wurde glaube ich über die Window-Styles eines Fenstern festgelegt). Wenn du es unbedingt mit COM machen willst, kann ich dir auf Anhieb leider nicht weiter helfen.



  • Schau dir mal hier den Abschnitt "Managing Taskbar Buttons" an 🙂



  • Danke für die schnellen Antworten 🙂

    Herrmann schrieb:

    Das Problem wurde hier schon einige Male erfolgreich besprochen (wurde glaube ich über die Window-Styles eines Fenstern festgelegt)

    Gib mir doch bitte mal einen Link auf den Beitrag, in dem das erfolgreich besprochen wurde, ich finde nichts brauchbares.

    Im übrigen habe ich es mit den Window Styles schon hoffnungslos probiert -.- :
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-103772.html

    Flenders schrieb:

    Schau dir mal hier den Abschnitt "Managing Taskbar Buttons" an 🙂

    Das bringt mich nur bedingt weiter. Ich kann mit

    MSDN schrieb:

    The Shell will remove a window's button from the taskbar only if the window's style supports visible taskbar buttons.

    nicht wirklich viel anfangen. Ich finde nirgends was dazu, welche Window Styles Taskbar Buttons nicht unterstützen, ausser WS_EX_TOOLWINDOW.

    Habe es also nochmal mit WS_EX_TOOLWINDOW probiert:

    ::ShowWindow(hWnd, SW_HIDE);
    	if (bAdd) ::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_TOOLWINDOW);
    	else ::SetWindowLong(hWnd, GWL_EXSTYLE, ::GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_TOOLWINDOW);
    	::ShowWindow(hWnd, SW_SHOW);
    

    So geht es zwar, aber es aendert sich auch immer der Style von ToolWindow zu "normalem" OverlappedWindow. Das kanns ja auch nicht sein oder?

    Ratschlaege? Tips? Fehler entdeckt? Kann mir nicht vorstellen, dass das so kompliziert sein kann 😞

    Gruss,
    DeSoVoDaMu



  • Ich würde ein Dummy-Fenster machen, das nich sichtbar ist und das dann als Parent-Fenster des richtigen Fensters machen.
    Dann erscheint fürs richtige Fenster kein Taskbar-Button (es sei denn man gibt WS_EX_APPWINDOW an...)



  • geeky schrieb:

    Ich würde ein Dummy-Fenster machen, das nich sichtbar ist und das dann als Parent-Fenster des richtigen Fensters machen.

    Das geht zwar ansich, allerdings bei mir nur ein einziges mal.
    Wenn ich den Dialog mit
    [cpp]g_hDlg = ::CreateDialog( ::GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DESOSTIMER), g_hInvisibleWnd, DlgProc);[/cpp]
    erstelle habe ich zwar kein Taskbar Button, aber sobald ich einen mit ::SetParent(g_hDlg, 0); erzeuge kann ich ihn nicht wieder entfernen, weil dann ::SetParent(g_hDlg, g_hInvisibleWnd); das Fenster verschwinden laesst. Ich kann es dann auch nicht wieder mit ::ShowWindow(g_hDlg, SW_SHOW); anzeigen lassen 😞

    Erzeuge ich den Dialog ohne ein Parent zu setzen kann ich den Taskbar Button garnicht entfernen 😞

    Noch Ideen? 😕

    Gruss,
    DeSoVoDaMu



  • Anstatt das Parent-Fenster zu ändern kannst du auch einfach ShowWindow mit SW_SHOW / SW_HIDE für das unsichtbare Parent-Fenster (z.B. Größe 0 und WS_POPUP) aufrufen.



  • Oder auch so:

    The Shell will remove a window's button from the taskbar only if the window's style supports visible taskbar buttons. If you want to dynamically change a window's style to one that doesn't support visible taskbar buttons, you must hide the window first (by calling ShowWindow with SW_HIDE), change the window style, and then show the window.



  • Mein Tipp: Unsichtbares Parent verwenden (s.o.). Zum Umschalten von "Taskbar-Button visible/nicht visible" WS_EX_APPWINDOW mit SetWindowLong() für das Child ein- und ausschalten. Nach einem Umschalten immer nochmal SetWindowPos() verwenden, damit der Effekt sichtbar ist.



  • flenders schrieb:

    Anstatt das Parent-Fenster zu ändern kannst du auch einfach ShowWindow mit SW_SHOW / SW_HIDE für das unsichtbare Parent-Fenster (z.B. Größe 0 und WS_POPUP) aufrufen.

    Ok, so scheint es zu gehen. Zwar finde ich es nicht astrein, vorallem, weil man dann verschiedenste Nachrichten vom Parent zum Child weiterleiten muss, aber da es scheinbar die einzige gehende Moeglichkeit ist, bleibt mir nichts anderes übrig 🙄

    WebFritzi schrieb:

    Mein Tipp: Unsichtbares Parent verwenden (s.o.). Zum Umschalten von "Taskbar-Button visible/nicht visible" WS_EX_APPWINDOW mit SetWindowLong() für das Child ein- und ausschalten. Nach einem Umschalten immer nochmal SetWindowPos() verwenden, damit der Effekt sichtbar ist.

    Waere echt genial, wenn du dazu einen funktionierenden Code postest, ich habe das auf die Weise zig hundert mal erfolglos probiert 😞

    Danke schonmal allen Helfern 👍

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten