ฉันรู้ว่าคำถามนี้ค่อนข้างเก่า แต่ฉันเพิ่งเจอสถานการณ์ที่แม่นยำนี้และต้องการแบ่งปันโซลูชันที่ฉันนำไปใช้
ดังที่ได้กล่าวไว้ในความคิดเห็นในหน้านี้โซลูชั่นที่เสนอหลายตัวไม่สามารถใช้กับ XP ได้ซึ่งฉันต้องให้การสนับสนุนในสถานการณ์ของฉัน ในขณะที่ฉันเห็นด้วยกับความเชื่อมั่นของ @Matthew Xavier ว่าโดยทั่วไปนี่เป็นวิธีปฏิบัติ UX ที่ไม่ดี แต่ก็มีหลายครั้งที่ UX นั้นเป็นไปได้ทั้งหมด
วิธีแก้ปัญหาในการนำหน้าต่าง WPF ขึ้นไปด้านบนนั้นให้ฉันโดยใช้รหัสเดียวกับที่ฉันใช้เพื่อให้ฮอตคีย์ทั่วโลก บทความบล็อกโดย Joseph Cooneyมีลิงค์ไปยังตัวอย่างโค้ดของเขาที่มีรหัสต้นฉบับ
ฉันล้างข้อมูลและแก้ไขโค้ดเล็กน้อยแล้วนำไปใช้เป็นวิธีการเพิ่มเติมไปยัง System.Windows.Window ฉันได้ทดสอบสิ่งนี้กับ XP 32 บิตและ Win7 64 บิตซึ่งทั้งคู่ทำงานได้อย่างถูกต้อง
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
}
}
ฉันหวังว่ารหัสนี้จะช่วยให้ผู้อื่นที่ประสบปัญหานี้