Afficher un Formulaire sans avoir l'accent?
Je suis en utilisant un Formulaire pour afficher les notifications (il apparaît en bas à droite de l'écran), mais quand je montre ce formulaire, il vole de l'accent du Formulaire principal. Est-il un moyen de montrer ce "notification" la forme sans la voler l'accent?
Vous devez vous connecter pour publier un commentaire.
Hmmm, n'est-ce pas tout simplement primordial Forme.ShowWithoutActivation assez?
Et si vous ne voulez pas que l'utilisateur cliquez sur cette fenêtre de notification en soit, vous pouvez remplacer CreateParams:
form1.Enabled = false
pour prévenir les commandes intérieures de voler focusWS_EX_NOACTIVATE
etWS_EX_TOOLWINDOW
sont0x08000000
et0x00000080
respectivement.Volé PInvoke.net's ShowWindow méthode:
(Alex Lyman répondu, je ne suis que de l'élargir par directement coller le code. Quelqu'un avec des droits d'édition peut copier et supprimer ce que j'en soins 😉 )
Si vous êtes prêt à utiliser Win32 P/Invoke, vous pouvez utiliser le ShowWindow méthode (le premier exemple de code fait exactement ce que vous voulez).
C'est ce qui a fonctionné pour moi. Il fournit plus haut, mais sans accent-vol.
N'oubliez pas de les omettre de réglage de niveau Supérieur dans le concepteur Visual Studio, ou ailleurs.
Ce n'est pas volé, err, emprunté, à partir d'ici (cliquez sur les Solutions):
https://connect.microsoft.com/VisualStudio/feedback/details/401311/showwithoutactivation-is-not-supported-with-topmost
Faire, cela semble un hack, mais il semble fonctionner:
Edit: Remarque, cela ne soulève déjà créé forme sans avoir le focus.
L'exemple de code à partir de pinvoke.net dans Alex Lyman/TheSoftwareJedi réponses feront de la fenêtre, un "niveau supérieur" de la fenêtre, ce qui signifie que vous ne pouvez pas le mettre derrière les fenêtres normales après qu'il est apparu. Compte tenu de Matias description de ce qu'il souhaite utiliser pour ce, qui pourrait être ce qu'il veut. Mais si vous voulez que l'utilisateur soit en mesure de mettre votre fenêtre de derrière d'autres fenêtres après que vous avez déclenché, il suffit d'utiliser HWND_TOP (0) au lieu de HWND_TOPMOST (-1) dans l'échantillon.
Dans WPF, vous pouvez le résoudre comme ceci:
Dans la fenêtre de mettre ces attributs:
Le dernier attribut est celui dont vous avez besoin ShowActivated="False".
Créer et démarrer le Formulaire de notification dans un thread séparé et réinitialiser le focus principal de votre formulaire après l'ouverture du Formulaire. Avoir le Formulaire de notification de fournir une OnFormOpened événement qui est déclenché à partir de la
Form.Shown
événement. Quelque chose comme ceci:Vous pouvez également garder une poignée pour votre NotifcationForm objet autour de sorte qu'il peut être fermé par programme par le Formulaire principal (
frm.Close()
).Certains détails manquent, mais j'espère que cela va vous aider à aller dans la bonne direction.
J'ai quelque chose de similaire, et j'ai simplement afficher le formulaire de notification et puis ne
à ramener le focus sur le formulaire principal.
Vous pourriez envisager ce type de notification que vous souhaitez afficher.
Si c'est absolument essentiel pour permettre à l'utilisateur de savoir à propos de certains événements, à l'aide de Messagebox.Spectacle serait la méthode recommandée, en raison de sa nature à bloquer tous les autres événements de la fenêtre principale, jusqu'à ce que l'utilisateur confirme qu'il. Être conscient de pop-up à la cécité, si.
Si c'est moins critique, vous pourriez vouloir utiliser un autre moyen d'afficher des notifications, par exemple une barre d'outils au bas de la fenêtre. Vous avez écrit, que vous avez l'affichage des notifications sur le coin inférieur droit de l'écran - le standard de la façon de le faire serait d'utiliser un info-bulle avec la combinaison d'un barre d'état système icône.
Cela fonctionne bien.
Voir: OpenIcon - MSDN et SetForegroundWindow - MSDN
Vous peut manipuler par la logique seule trop, même si je dois admettre que les suggestions ci-dessus où vous vous retrouvez avec un BringToFront méthode sans avoir à en voler l'accent est le plus élégant.
De toute façon, je suis tombé sur cette et résolu à l'aide d'un DateTime propriété de ne pas permettre la poursuite de l'BringToFront appels si les appels ont été faits déjà récemment.
Supposons une classe de base, 'Core', qui gère par exemple les trois formes, 'Form1, 2, et 3'. Chaque forme a besoin d'un DateTime propriété et un événement Activer cet appel de Base pour mettre windows à l'avant:
Et de créer ensuite le travail dans la Classe de Base:
Sur une note de côté, si vous souhaitez restaurer une fenêtre réduite à son état d'origine (pas maximisée), utilisation:
Encore une fois, je sais que c'est juste un patch de la solution en l'absence d'un BringToFrontWithoutFocus. C'est une suggestion, si vous voulez éviter le fichier DLL.
Je ne sais pas si cela est considéré comme du nécro-poster, mais c'est ce que j'ai fait depuis que j'ai couln pas le faire fonctionner avec user32 "de ShowWindow" et "SetWindowPos" méthodes. Et non, en remplaçant "ShowWithoutActivation" ne fonctionne pas dans ce cas puisque la nouvelle fenêtre doit être toujours-sur-dessus.
De toute façon, j'ai créé une méthode d'assistance qui prend une forme en paramètre; lorsqu'il est appelé, il montre la forme, il apporte à l'avant et met au Premier plan sans avoir le focus de la fenêtre en cours (apparemment, il n', mais l'utilisateur ne remarque pas).
Je sais que cela peut sembler stupide, mais cela a fonctionné:
J'avais besoin de le faire avec ma fenêtre au Premier plan. J'ai mis en place le PInvoke méthode ci-dessus, mais a constaté que ma Charge de l'événement n'était pas appelé comme Talha ci-dessus. J'ai enfin réussi. Peut-être que cela aidera quelqu'un. Voici ma solution:
Lorsque vous créez un nouveau formulaire à l'aide de
il vole de se concentrer parce que votre code ne peut pas poursuivre l'exécution sur le formulaire principal jusqu'à ce que ce formulaire est fermé.
L'exception est par l'utilisation de threads de créer une nouvelle forme alors de la Forme.Show(). Assurez-vous que le fil est visible au niveau mondial, parce que si vous déclarez à l'intérieur d'une fonction, dès que votre fonction se termine, votre fil fin et la forme disparaît.
Compris:
window.WindowState = WindowState.Minimized;
.