Używam formularza do wyświetlania powiadomień (pojawia się w prawym dolnym rogu ekranu), ale kiedy pokazuję ten formularz, przejmuje fokus z głównego formularza. Czy istnieje sposób na wyświetlenie tego formularza „powiadomienia” bez kradzieży fokusu?
140
form1.Enabled = false
aby wewnętrzne sterowanie nie kradło ostrościWS_EX_NOACTIVATE
iWS_EX_TOOLWINDOW
są odpowiednio0x08000000
i0x00000080
.Skradzione z PInvoke.net jest ShowWindow metodą:
(Alex Lyman odpowiedział na to pytanie, po prostu rozszerzam go, bezpośrednio wklejając kod. Ktoś z prawami do edycji może go tam skopiować i usunąć to, co mnie interesuje;))
źródło
Jeśli chcesz użyć Win32 P / Invoke , możesz użyć metody ShowWindow (pierwszy przykład kodu robi dokładnie to, co chcesz).
źródło
To właśnie zadziałało dla mnie. Zapewnia TopMost, ale bez kradzieży ostrości.
Pamiętaj, aby pominąć ustawienie TopMost w programie Visual Studio Designer lub w innym miejscu.
To jest skradzione, błędne, pożyczone, stąd (kliknij Obejście):
https://connect.microsoft.com/VisualStudio/feedback/details/401311/showwithoutactivation-is-not-supported-with-topmost
źródło
Wydaje się, że to hack, ale wydaje się działać:
Edycja: Uwaga, to po prostu podnosi już utworzony formularz bez kradzieży ostrości.
źródło
Przykładowy kod z pinvoke.net w odpowiedziach Alexa Lymana / TheSoftwareJedi sprawi, że okno będzie oknem „najwyższym”, co oznacza, że nie można go umieścić za zwykłymi oknami po tym, jak się pojawi. Biorąc pod uwagę opis Matiasa, do czego chce tego użyć, może to być to, czego chce. Ale jeśli chcesz, aby użytkownik mógł umieścić twoje okno za innymi oknami po tym, jak je wyskoczyłeś, po prostu użyj HWND_TOP (0) zamiast HWND_TOPMOST (-1) w przykładzie.
źródło
W WPF można to rozwiązać w następujący sposób:
W oknie umieść te atrybuty:
Ostatni atrybut to ten, którego potrzebujesz ShowActivated = "False".
źródło
Mam coś podobnego i po prostu pokazuję formularz zgłoszeniowy a potem robię
skupić się z powrotem na głównym formularzu.
źródło
Utwórz i uruchom formularz powiadomienia w osobnym wątku i zresetuj fokus z powrotem do formularza głównego po otwarciu formularza. Poproś formularz powiadomienia o dostarczenie zdarzenia OnFormOpened, które jest uruchamiane ze
Form.Shown
zdarzenia. Coś takiego:Możesz również zachować uchwyt do obiektu NotifcationForm, aby mógł być programowo zamknięty przez główny formularz Form (
frm.Close()
).Brakuje niektórych szczegółów, ale miejmy nadzieję, że poprowadzi Cię to we właściwym kierunku.
źródło
Możesz zastanowić się, jakiego rodzaju powiadomienie chcesz wyświetlić.
Jeśli jest absolutnie krytyczne, aby poinformować użytkownika o jakimś zdarzeniu, zaleca się użycie Messagebox.Show, ze względu na jego naturę, aby zablokować wszelkie inne zdarzenia w oknie głównym, dopóki użytkownik tego nie potwierdzi. Uważaj jednak na wyskakującą ślepotę.
Jeśli jest to mniej niż krytyczne, możesz chcieć użyć alternatywnego sposobu wyświetlania powiadomień, na przykład paska narzędzi u dołu okna. Napisałeś, że wyświetlasz powiadomienia w prawym dolnym rogu ekranu - standardowym sposobem byłoby użycie końcówki dymku z kombinacją ikony zasobnika systemowego .
źródło
To działa dobrze.
Zobacz: OpenIcon - MSDN i SetForegroundWindow - MSDN
źródło
Państwo może obsługiwać go za pomocą logiki sam też, chociaż muszę przyznać, że powyższe sugestie, gdzie kończy się z metodą BringToFront bez faktycznie kradzież ostrość jest najbardziej elegancki jeden.
W każdym razie natknąłem się na to i rozwiązałem to, używając właściwości DateTime, aby nie zezwalać na dalsze wywołania BringToFront, jeśli połączenia były wykonywane już niedawno.
Załóżmy podstawową klasę „Core”, która obsługuje na przykład trzy formularze „Form1, 2 i 3”. Każdy formularz wymaga właściwości DateTime i zdarzenia Activate, które wywołuje Core w celu przeniesienia okien na wierzch:
A następnie stwórz pracę w Core Class:
Na marginesie, jeśli chcesz przywrócić zminimalizowane okno do jego pierwotnego stanu (nie zmaksymalizowane), użyj:
Ponownie, wiem, że to tylko łatka bez BringToFrontWithoutFocus. Jest to sugestia, jeśli chcesz uniknąć pliku DLL.
źródło
Nie wiem, czy jest to uważane za nekro-wysyłanie, ale właśnie to zrobiłem, ponieważ nie mogę go uruchomić z metodami „ShowWindow” i „SetWindowPos” użytkownika 32. I nie, nadpisywanie „ShowWithoutActivation” nie działa w tym przypadku, ponieważ nowe okno powinno być zawsze na wierzchu. W każdym razie stworzyłem metodę pomocniczą, która przyjmuje postać jako parametr; po wywołaniu pokazuje formularz, przenosi go na wierzch i sprawia, że jest to TopMost bez kradzieży fokusu bieżącego okna (najwyraźniej tak, ale użytkownik tego nie zauważy).
źródło
Wiem, że to może brzmieć głupio, ale to zadziałało:
źródło
Musiałem to zrobić z moim oknem TopMost. Zaimplementowałem powyższą metodę PInvoke, ale stwierdziłem, że moje zdarzenie Load nie jest wywoływane jak powyżej Talha. W końcu mi się udało. Może to komuś pomoże. Oto moje rozwiązanie:
źródło
Podczas tworzenia nowego formularza za pomocą
kradnie fokus, ponieważ Twój kod nie może kontynuować wykonywania w głównym formularzu, dopóki ten formularz nie zostanie zamknięty.
Wyjątkiem jest użycie wątków do utworzenia nowego formularza, a następnie Form.Show (). Upewnij się jednak, że wątek jest widoczny globalnie, ponieważ jeśli zadeklarujesz go w funkcji, zaraz po zakończeniu funkcji wątek zakończy się, a formularz zniknie.
źródło
Zorientowaliśmy się:
window.WindowState = WindowState.Minimized;
.źródło