Jestem programistą .NET od kilku lat i nadal jest to jedna z tych rzeczy, których nie umiem zrobić poprawnie. Łatwo jest ukryć okno z paska zadań za pomocą właściwości zarówno w Windows Forms, jak i WPF, ale o ile wiem, nie gwarantuje to (ani nawet nie wpływa) na jego ukrycie w Alt+ ↹Taboknie dialogowym. Widziałem niewidoczne okna pojawiające się w Alt+ ↹Tabi zastanawiam się, jaki jest najlepszy sposób na zagwarantowanie, że okno nigdy się nie pojawi (widoczne lub nie) w oknie dialogowym Alt+ ↹Tab.
Aktualizacja: zobacz poniżej moje opublikowane rozwiązanie. Nie wolno mi oznaczać własnych odpowiedzi jako rozwiązania, ale jak dotąd jest to jedyne, które działa.
Aktualizacja 2: Franci Penov ma teraz odpowiednie rozwiązanie, które wygląda całkiem nieźle, ale sam go nie wypróbowałem. Obejmuje niektóre Win32, ale unika kulawego tworzenia okien poza ekranem.
Odpowiedzi:
Aktualizacja:
Według @donovan, współczesne WPF obsługuje to natywnie, poprzez ustawienie
ShowInTaskbar="False"
iVisibility="Hidden"
w języku XAML. (Jeszcze tego nie testowałem, ale mimo to postanowiłem zwiększyć widoczność komentarzy)Oryginalna odpowiedź:
Istnieją dwa sposoby ukrycia okna z przełącznika zadań w Win32 API:
WS_EX_TOOLWINDOW
rozszerzony styl okna - to jest właściwe podejście.Niestety, WPF nie obsługuje tak elastycznej kontroli nad stylem okna jak Win32, więc okno z
WindowStyle=ToolWindow
kończy się na domyślnychWS_CAPTION
iWS_SYSMENU
stylach, co powoduje, że ma podpis i przycisk zamykania. Z drugiej strony możesz usunąć te dwa style, ustawiającWindowStyle=None
, jednak nie spowoduje to ustawieniaWS_EX_TOOLWINDOW
rozszerzonego stylu, a okno nie będzie ukryte przed przełącznikiem zadań.Aby mieć okno WPF z
WindowStyle=None
tym, które jest również ukryte przed przełącznikiem zadań, można wybrać jeden z dwóch sposobów:WS_EX_TOOLWINDOW
styl rozszerzony.Osobiście wolę drugie podejście. Z drugiej strony robię zaawansowane rzeczy, takie jak rozszerzenie szyby w obszarze roboczym i i tak włączenie rysowania WPF w podpisie, więc odrobina interopu nie jest dużym problemem.
Oto przykładowy kod rozwiązania międzyoperacyjnego Win32. Najpierw część XAML:
Nic nadzwyczajnego, po prostu deklarujemy okno z
WindowStyle=None
iShowInTaskbar=False
. Dodajemy również procedurę obsługi do zdarzenia Loaded, w którym zmodyfikujemy rozszerzony styl okna. Nie możemy wykonać tej pracy w konstruktorze, ponieważ w tym momencie nie ma jeszcze uchwytu okna. Sam program obsługi zdarzeń jest bardzo prosty:I deklaracje międzyoperacyjne Win32. Usunąłem wszystkie niepotrzebne style z wyliczeń, aby przykładowy kod był mały. Niestety,
SetWindowLongPtr
punkt wejścia nie znajduje się w user32.dll w systemie Windows XP, stąd sztuczka z przekierowywaniem połączenia przez tenSetWindowLong
plik.źródło
Wewnątrz klasy formularza dodaj to:
To takie proste; działa czarująco!
źródło
Znalazłem rozwiązanie, ale nie jest ładne. Jak dotąd jest to jedyna rzecz, którą wypróbowałem, która faktycznie działa:
Znalazłem to tutaj .
Przydałoby się bardziej ogólne rozwiązanie wielokrotnego użytku. Przypuszczam, że możesz utworzyć pojedyncze okno „w” i użyć go ponownie dla wszystkich okien w aplikacji, które muszą być ukryte przed przyciskiem Alt+ ↹Tab.
Aktualizacja: Ok, więc to, co zrobiłem, to przeniesienie powyższego kodu, bez
this.Owner = w
bitu (i przejściew.Hide()
natychmiast po nimw.Show()
, co działa dobrze) do konstruktora mojej aplikacji, tworząc publiczny statyczny plik oWindow
nazwieOwnerWindow
. Zawsze, gdy chcę, aby okno wykazywało takie zachowanie, po prostu ustawiamthis.Owner = App.OwnerWindow
. Działa świetnie i wymaga tylko stworzenia jednego dodatkowego (i niewidocznego) okna. Możesz nawet ustawić,this.Owner = null
czy chcesz, aby okno pojawiło się ponownie w oknie Alt+ ↹Tab.Podziękowania dla Ivana Onuchina na forach MSDN za rozwiązanie.
Aktualizacja 2: Należy również ustawić
ShowInTaskBar=false
naw
celu zapobiec jej krótko miga na pasku zadań, gdy pokazano.źródło
-100000
Lepsze byłoby prawdopodobnie użycie takiego przesunięcia .Dlaczego tak skomplikowane? Spróbuj tego:
Pomysł zaczerpnięty stąd: http://www.csharp411.com/hide-form-from-alttab/
źródło
Oto, na czym polega sztuczka, niezależnie od stylu okna, przed którym próbujesz ukryć Alt+ ↹Tab.
Umieść następujące elementy w konstruktorze swojego formularza:
Zasadniczo sprawiasz, że twój formularz jest dzieckiem niewidocznego okna, które ma odpowiedni styl i ustawienie ShowInTaskbar, aby nie było na liście Alt-Tab. Należy również ustawić właściwość ShowInTaskbar własnego formularza na false. A co najważniejsze, po prostu nie ma znaczenia, jaki styl ma twój główny formularz, a wszystkie poprawki w celu ukrycia to tylko kilka wierszy w kodzie konstruktora.
źródło
Po co próbować tyle kodów? Po prostu ustaw właściwość
FormBorderStyle
naFixedToolWindow
. Mam nadzieję, że to pomoże.źródło
zobacz: (z http://bytes.com/topic/c-sharp/answers/442047-hide-alt-tab-list#post1683880 )
źródło
W XAML ustaw ShowInTaskbar = "False":
Edycja: to nadal pokazuje to w Alt + Tab, ale chyba nie na pasku zadań.
źródło
Próbowałem ustawić widoczność głównego formularza na fałsz, ilekroć jest ona automatycznie zmieniana na true:
Działa idealnie :)
źródło
jeśli chcesz, aby formularz był bez obramowania, musisz dodać następujące instrukcje do konstruktora formularza:
ORAZ musisz dodać następującą metodę do swojej pochodnej klasy Form:
więcej szczegółów
źródło
Nie pokazuj formularza. Użyj niewidzialności.
Więcej tutaj: http://code.msdn.microsoft.com/TheNotifyIconExample
źródło
Właściwości Form1:
FormBorderStyle : Sizable
WindowState: Zminimalizowane
ShowInTaskbar: False
źródło
Osobiście, o ile wiem, nie jest to możliwe bez podpięcia do okien w jakiś sposób, nie jestem nawet pewien, jak by to zrobić i czy jest to możliwe.
W zależności od potrzeb, rozwijanie kontekstu aplikacji jako aplikacji NotifyIcon (zasobnik systemowy) umożliwi jej działanie bez wyświetlania w ALT + TAB. JEDNAK, jeśli otworzysz formularz, będzie on nadal spełniał standardowe funkcje.
Mogę odkopać mój artykuł na blogu o tworzeniu aplikacji, która domyślnie jest TYLKO NotifyIcon, jeśli chcesz.
źródło