मुझे पता है कि यह सवाल पुराना है, लेकिन मैं अभी इस सटीक परिदृश्य पर आया हूं और मेरे द्वारा लागू किए गए समाधान को साझा करना चाहता था।
जैसा कि इस पृष्ठ पर टिप्पणियों में उल्लेख किया गया है, प्रस्तावित कई समाधान एक्सपी पर काम नहीं करते हैं, जिन्हें मुझे अपने परिदृश्य में समर्थन करने की आवश्यकता है। जबकि मैं @ मैथ्यू जेवियर की भावना से सहमत हूं कि आम तौर पर यह एक बुरा यूएक्स अभ्यास है, ऐसे समय होते हैं जहां यह पूरी तरह से एक प्रशंसनीय यूएक्स है।
WPF विंडो को शीर्ष पर लाने का समाधान वास्तव में मुझे उसी कोड द्वारा प्रदान किया गया था जिसका उपयोग मैं वैश्विक हॉटकी प्रदान करने के लिए कर रहा हूं। जोसेफ कॉनी के एक ब्लॉग लेख में उनके कोड नमूनों का लिंक है जिसमें मूल कोड शामिल है।
मैंने कोड को साफ किया है और कोड को थोड़ा संशोधित किया है, और इसे System.Windows.Window के विस्तार विधि के रूप में लागू किया है। मैंने इसे एक्सपी 32 बिट और विन 7 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
}
}
मुझे उम्मीद है कि यह कोड उन लोगों की मदद करता है जो इस समस्या का सामना करते हैं।