So che questa domanda è piuttosto vecchia, ma mi sono appena imbattuto in questo preciso scenario e volevo condividere la soluzione che ho implementato.
Come accennato nei commenti in questa pagina, molte delle soluzioni proposte non funzionano su XP, che devo supportare nel mio scenario. Anche se sono d'accordo con l'opinione di @Matthew Xavier che generalmente questa è una cattiva pratica di UX, ci sono momenti in cui è del tutto plausibile.
La soluzione per portare una finestra WPF in alto mi è stata effettivamente fornita dallo stesso codice che sto usando per fornire il tasto di scelta rapida globale. Un articolo del blog di Joseph Cooney contiene un collegamento ai suoi esempi di codice che contiene il codice originale.
Ho ripulito e modificato un po 'il codice e l'ho implementato come metodo di estensione per System.Windows.Window. L'ho testato su XP 32 bit e Win7 64 bit, entrambi funzionano correttamente.
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
public static void GlobalActivate(this Window w)
{
var interopHelper = new WindowInteropHelper(w);
var thisWindowThreadId = GetWindowThreadProcessId(interopHelper.Handle, IntPtr.Zero);
var currentForegroundWindow = GetForegroundWindow();
var currentForegroundWindowThreadId = GetWindowThreadProcessId(currentForegroundWindow, IntPtr.Zero);
AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, true);
SetWindowPos(interopHelper.Handle, new IntPtr(0), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
AttachThreadInput(currentForegroundWindowThreadId, thisWindowThreadId, false);
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
}
}
Spero che questo codice aiuti gli altri che riscontrano questo problema.