Comment puis-je mettre mon application WPF à l'avant du bureau? Jusqu'à présent, j'ai essayé:
SwitchToThisWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle, true);
SetWindowPos(new WindowInteropHelper(Application.Current.MainWindow).Handle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
SetForegroundWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle);
Aucun d'entre eux ne fait le travail ( Marshal.GetLastWin32Error()
indique que ces opérations se sont terminées avec succès et que les attributs P / Invoke pour chaque définition en ont SetLastError=true
).
Si je crée une nouvelle application WPF vierge et que j'appelle SwitchToThisWindow
avec un minuteur, cela fonctionne exactement comme prévu, donc je ne sais pas pourquoi cela ne fonctionne pas dans mon cas d'origine.
Edit : je fais cela en conjonction avec un raccourci clavier global.
Réponses:
Tente d'amener la fenêtre au premier plan et de l'activer.
Cela devrait faire l'affaire, sauf si j'ai mal compris et que vous voulez un comportement Always on Top. Dans ce cas, vous souhaitez:
la source
Topmost
propriété est une mauvaise pratique car elle peut masquer d'autres boîtes de dialogue contextuelles et avoir un comportement inattendu.if (myWindow.WindowState == WindowState.Minimized) myWindow.WindowState = WindowState.Normal;
Curieusement, il préservera également toutes les fenêtres maximisées et ne les ramènera pas à un état normal.J'ai trouvé une solution qui amène la fenêtre en haut, mais elle se comporte comme une fenêtre normale:
la source
Window.Focus()
. Cela détournera l'attention de ce que l'utilisateur tape actuellement dans une zone de texte, ce qui est extrêmement frustrant pour les utilisateurs finaux. Le code ci-dessus fonctionne très bien sans lui.Si vous avez besoin que la fenêtre soit devant la première fois qu'elle se charge, vous devez utiliser les éléments suivants:
la source
Pour en faire un copier-coller rapide -
Utilisez cette
DoOnProcess
méthode de classe pour déplacer la fenêtre principale du processus au premier plan (mais pas pour voler le focus à partir d'autres fenêtres)HTH
la source
process.MainWindowHandle
?hWnd
. FWIW unHwndSource
objet a bien fonctionné.Je sais que cette question est assez ancienne, mais je viens de tomber sur ce scénario précis et je voulais partager la solution que j'ai implémentée.
Comme mentionné dans les commentaires sur cette page, plusieurs des solutions proposées ne fonctionnent pas sur XP, que je dois prendre en charge dans mon scénario. Bien que je sois d'accord avec le sentiment de @Matthew Xavier selon lequel c'est généralement une mauvaise pratique UX, il y a des moments où c'est entièrement une UX plausable.
La solution pour amener une fenêtre WPF au sommet m'a été fournie par le même code que j'utilise pour fournir le raccourci clavier global. Un article de blog de Joseph Cooney contient un lien vers ses exemples de code qui contient le code d'origine.
J'ai nettoyé et modifié un peu le code et l'ai implémenté comme méthode d'extension à System.Windows.Window. J'ai testé cela sur XP 32 bits et Win7 64 bits, qui fonctionnent tous les deux correctement.
J'espère que ce code aide ceux qui rencontrent ce problème.
la source
this.Activate()
ne semble fonctionner que quelques fois.Si l'utilisateur interagit avec une autre application, il peut ne pas être possible de mettre la vôtre au premier plan. En règle générale, un processus ne peut s'attendre à définir la fenêtre de premier plan que si ce processus est déjà le processus de premier plan. (Microsoft documente les restrictions dans l' entrée MSDN SetForegroundWindow () .) En effet:
la source
Je sais que c'est une réponse tardive, peut-être utile pour les chercheurs
la source
Pourquoi certaines des réponses sur cette page sont fausses!
Toute réponse qui utilise
window.Focus()
est fausse.window.Focus()
le focus s'éloignera de tout ce que l'utilisateur tape à l'époque. Cela est extrêmement frustrant pour les utilisateurs finaux, surtout si les fenêtres contextuelles apparaissent assez fréquemment.Toute réponse qui utilise
window.Activate()
est fausse.window.ShowActivated = false
est fausse.Visibility.Visible
pour masquer / afficher la fenêtre est fausse.window.Show()
etwindow.Hide()
.Essentiellement:
Solution MVVM
Ce code est 100% compatible avec Citrix (pas de zones vides de l'écran). Il est testé avec WPF normal et DevExpress.
Cette réponse est destinée à tout cas d'utilisation où nous voulons une petite fenêtre de notification qui est toujours en face des autres fenêtres (si l'utilisateur le sélectionne dans les préférences).
Si cette réponse semble plus complexe que les autres, c'est parce qu'elle est robuste, au niveau de l'entreprise. Certaines des autres réponses sur cette page sont simples, mais ne fonctionnent pas réellement.
XAML - Propriété attenante
Ajoutez cette propriété attachée à n'importe quelle
UserControl
dans la fenêtre. La propriété attenante:Loaded
événement soit déclenché (sinon il ne peut pas rechercher dans l'arborescence visuelle pour trouver la fenêtre parent).À tout moment, vous pouvez définir la fenêtre devant ou non, en inversant la valeur de la propriété attachée.
C # - Méthode d'assistance
Usage
Pour l'utiliser, vous devez créer la fenêtre dans votre ViewModel:
Liens supplémentaires
Pour obtenir des conseils sur la façon de garantir qu'une fenêtre de notification revient toujours sur l'écran visible, consultez ma réponse: dans WPF, comment déplacer une fenêtre sur l'écran si elle est hors de l'écran? .
la source
catch (Exception) { }
. Ouais bien ... Et il utilise du code qui n'est même pas affiché dans la réponse comme_dialogService
ouShiftWindowOntoScreenHelper
. De plus, demander à créer la fenêtre dans le côté du modèle de vue (ce qui brise fondamentalement tout le modèle MVVM) ...Func<>
qui est lié au ViewModel.J'ai rencontré un problème similaire avec une application WPF qui est invoquée à partir d'une application Access via l'objet Shell.
Ma solution est ci-dessous - fonctionne sous XP et Win7 x64 avec une application compilée sur la cible x86.
Je préfère de loin le faire que de simuler un alt-tab.
la source
Eh bien, puisque c'est un sujet brûlant ... voici ce qui fonctionne pour moi. J'ai des erreurs si je ne l'ai pas fait de cette façon car Activate () vous enverra une erreur si vous ne pouvez pas voir la fenêtre.
Xaml:
Codebehind:
C'était la seule façon pour moi d'afficher la fenêtre en haut. Ensuite, activez-le pour pouvoir taper dans la case sans avoir à régler le focus avec la souris. control.Focus () ne fonctionnera pas à moins que la fenêtre ne soit active ();
la source
Eh bien, j'ai trouvé une solution. Je fais l'appel à partir d'un crochet clavier utilisé pour implémenter un raccourci clavier. L'appel fonctionne comme prévu si je le mets dans un BackgroundWorker avec une pause. C'est un coup de coude, mais je n'ai aucune idée pourquoi cela ne fonctionnait pas à l'origine.
la source
Pour afficher TOUTE fenêtre actuellement ouverte, importez ces DLL:
et dans le programme Nous recherchons une application avec un titre spécifié (écrire le titre sans la première lettre (index> 0))
la source
IndexOf
correctement à la place?Le problème pourrait être que le thread appelant votre code à partir du hook n'a pas été initialisé par le runtime, donc les méthodes d'exécution ne fonctionnent pas.
Vous pouvez peut-être essayer de faire un appel pour rassembler votre code sur le thread d'interface utilisateur pour appeler votre code qui amène la fenêtre au premier plan.
la source
Ces codes fonctionneront bien à tout moment.
Définissez d'abord le gestionnaire d'événements activé dans XAML:
Ajoutez la ligne ci-dessous à votre bloc constructeur de la fenêtre principale:
Et à l'intérieur du gestionnaire d'événements activé, copiez ces codes:
Ces étapes fonctionneront bien et amèneront toutes les autres fenêtres dans la fenêtre de leurs parents.
la source
Si vous essayez de masquer la fenêtre, par exemple, vous réduisez la fenêtre, j'ai constaté qu'en utilisant
le masquera correctement, puis en utilisant simplement
affichera alors à nouveau la fenêtre comme l'élément le plus haut.
la source
Je voulais juste ajouter une autre solution à cette question. Cette implémentation fonctionne pour mon scénario, où CaliBurn est responsable de l'affichage de la fenêtre principale.
la source
N'oubliez pas de ne pas placer le code qui montre cette fenêtre dans un gestionnaire PreviewMouseDoubleClick car la fenêtre active reviendra à la fenêtre qui a géré l'événement. Placez-le simplement dans le gestionnaire d'événements MouseDoubleClick ou arrêtez la propagation en définissant e.Handled sur True.
Dans mon cas, je manipulais le PreviewMouseDoubleClick sur une vue de liste et ne définissais pas le e.Handled = true, puis il a déclenché l'événement MouseDoubleClick avec le focus sur la fenêtre d'origine.
la source
J'ai construit une méthode d'extension pour faciliter la réutilisation.
Appelez le constructeur de formulaire
la source