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.