Saya tahu pertanyaan ini agak lama, tetapi saya baru saja menemukan skenario yang tepat ini dan ingin berbagi solusi yang telah saya terapkan.
Seperti disebutkan dalam komentar di halaman ini, beberapa solusi yang diusulkan tidak berfungsi pada XP, yang perlu saya dukung dalam skenario saya. Sementara saya setuju dengan sentimen oleh @Matthew Xavier bahwa umumnya ini adalah praktik UX yang buruk, ada kalanya itu sepenuhnya merupakan UX yang masuk akal.
Solusi untuk membawa jendela WPF ke atas sebenarnya diberikan kepada saya oleh kode yang sama yang saya gunakan untuk menyediakan hotkey global. Artikel blog oleh Joseph Cooney berisi tautan ke contoh kode yang berisi kode asli.
Saya telah membersihkan dan memodifikasi kode sedikit, dan menerapkannya sebagai metode ekstensi untuk System.Windows.Window. Saya sudah menguji ini pada XP 32 bit dan Win7 64 bit, keduanya bekerja dengan benar.
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
}
}
Saya harap kode ini membantu orang lain yang mengalami masalah ini.