242 votes

Amener une fenêtre au premier plan dans WPF

Comment puis-je amener mon application WPF à l'avant de l'ordinateur de 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 n'est à faire le travail (Marshal.GetLastWin32Error() , c'est dire ces opérations terminées avec succès, et le P/Invoke attributs pour chaque définition n'ont SetLastError=true).

Si je créer une nouvelle application WPF, et appelez - SwitchToThisWindow , avec un minuteur, il fonctionne exactement comme prévu, donc je ne sais pas pourquoi il ne fonctionne pas dans mon cas.

Edit: je suis en train de faire ceci en conjonction avec une touche d'accès rapide.

345voto

<pre><code></code><p><em>Tente d’afficher la fenêtre au premier plan et l’active.</em></p><p>Qui devrait faire l’affaire, à moins que j’ai mal compris et que vous voulez toujours sur le comportement des albums. Dans ce cas, vous souhaitez :</p><pre><code></code></pre></pre>

191voto

Jader Dias Points 23461

J’ai trouvé une solution qui apporte la fenêtre vers le haut, mais il se comporte comme une fenêtre normale :

39voto

Amir Points 91

Dans le cas où vous avez besoin de la fenêtre pour être devant la première fois, il charge alors vous devriez utiliser le texte suivant :

28voto

Zodman Points 329

Je sais que cette question est un peu vieux, mais je viens de tomber sur ce scénario précis et je voulais partager la solution que j'ai mis en œuvre.

Comme mentionné dans les commentaires sur cette page, plusieurs des solutions proposées ne fonctionne pas sur XP, j'ai besoin de soutien dans mon scénario. Alors que je suis d'accord avec le sentiment par @Matthieu de Xavier que généralement, c'est une mauvaise UX pratique, il y a des moments où il est tout à fait un plausable UX.

La solution à apporter une fenêtre WPF pour le haut était en fait qui m'a été fourni par le même code que j'utilise pour fournir la touche d'accès rapide. Un article de blog par 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 mis en œuvre comme une méthode d'extension du Système.De Windows.De la fenêtre. J'ai testé sur XP 32 bits et windows 7 64 bits, qui fonctionne correctement.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Interop;
using System.Runtime.InteropServices;

namespace System.Windows
{
    public static class SystemWindows
    {
        #region Constants

        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 SWP_SHOWWINDOW = 0x0040;

        #endregion

        /// <summary>
        /// Activate a window from anywhere by attaching to the foreground window
        /// </summary>
        public static void GlobalActivate(this Window w)
        {
            //Get the process ID for this window's thread
            var interopHelper = new WindowInteropHelper(w);
            var thisWindowThreadId = GetWindowThreadProcessId(interopHelper.Handle, IntPtr.Zero);

            //Get the process ID for the foreground window's thread
            var currentForegroundWindow = GetForegroundWindow();
            var currentForegroundWindowThreadId = GetWindowThreadProcessId(currentForegroundWindow, IntPtr.Zero);

            //Attach this window's thread to the current window's thread
            AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true);

            //Set the window position
            SetWindowPos(interopHelper.Handle, new IntPtr(0), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);

            //Detach this window's thread from the current window's thread
            AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);

            //Show and activate the window
            if (w.WindowState == WindowState.Minimized) w.WindowState = WindowState.Normal;
            w.Show();
            w.Activate();
        }

        #region Imports

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        private static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);

        [DllImport("user32.dll")]
        private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

        [DllImport("user32.dll")]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        #endregion
    }
}

J'espère que ce code à l'aide d'autres personnes qui rencontrent ce problème.

25voto

Hertzel Guinness Points 2983

Pour en faire un copier-coller rapide-
Utilisez cette classe `` méthode pour déplacer la fenêtre principale du processus au premier plan (mais ne pas de voler la mise au point d’autres fenêtres)

HTH

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X