나는이 질문이 다소 오래되었다는 것을 알고 있지만이 정확한 시나리오를 보았고 구현 한 솔루션을 공유하고 싶었습니다.
이 페이지의 의견에서 언급했듯이 제안 된 여러 솔루션은 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
}
}
이 코드가이 문제를 겪는 다른 사람들에게 도움이되기를 바랍니다.