[英]Bring window to front on Windows 8
I'm developing wpf application and I want to bring main window to front. 我正在开发wpf应用程序,我想将主窗口置于最前面。 When the app is launching from the folder everything works fine on windows xp and windows 7. On window 8 the app remains in the background. 从文件夹启动应用程序时,在Windows XP和Windows 7上一切正常。在第8窗口中,应用程序保留在后台。 I tried overrride OnLoadCompleted method and call win32 api method https://stackoverflow.com/a/7559766/2250152 but it's not working on windows 8. 我尝试重写OnLoadCompleted方法并调用win32 api方法https://stackoverflow.com/a/7559766/2250152,但它在Windows 8上不起作用。
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
ShowSplashScreen();
}
private void ShowSplashScreen()
{
Thread newWindowThread = new Thread(ThreadStartingPoint);
newWindowThread.SetApartmentState(ApartmentState.STA);
newWindowThread.IsBackground = true;
newWindowThread.Start();
}
private void ThreadStartingPoint()
{
SplashScreen splashScreen = new SplashScreen();
splashScreen.Closed += splashScreen_Closed;
splashScreen.ShowDialog();
}
void splashScreen_Closed(object sender, EventArgs e)
{
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
{
Current.MainWindow.Activate(); // or win 32 api method SetForegroundWindow
}
}
here is a solution that works in my apps. 这是适用于我的应用程序的解决方案。 (maybe it's necessary to call this with Dispatcher.CurrentDispatcher.BeginInvoke
) (也许有必要使用Dispatcher.CurrentDispatcher.BeginInvoke
来调用它)
public static void ShowAndActivate(this Window window)
{
if (window == null) {
return;
}
var hwnd = new WindowInteropHelper(window).Handle;
ActivateWindowHandle(hwnd);
}
/// <summary>
/// Activates and sets focus to the Window Object
/// </summary>
public static void ActivateWindowHandle(IntPtr hWnd)
{
var threadId1 = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero);
var threadId2 = GetWindowThreadProcessId(hWnd, IntPtr.Zero);
if (threadId1 != threadId2) {
AttachThreadInput(threadId1, threadId2, 1);
SetForegroundWindow(hWnd);
AttachThreadInput(threadId1, threadId2, 0);
} else {
SetForegroundWindow(hWnd);
}
if (IsIconic(hWnd)) {
ShowWindowAsync(hWnd, ShowWindowCommands.Restore);
} else {
ShowWindowAsync(hWnd, ShowWindowCommands.Show);
}
}
[DllImport("user32.dll")]
public static extern bool IsIconic(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, ShowWindowCommands cmdShow);
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(IntPtr hWnd);
public enum ShowWindowCommands : int
{
/// <summary>
/// Hides the window and activates another window.
/// </summary>
Hide = 0,
/// <summary>
/// Activates and displays a window. If the window is minimized or
/// maximized, the system restores it to its original size and position.
/// An application should specify this flag when displaying the window
/// for the first time.
/// </summary>
Normal = 1,
/// <summary>
/// Activates the window and displays it as a minimized window.
/// </summary>
ShowMinimized = 2,
/// <summary>
/// Maximizes the specified window.
/// </summary>
Maximize = 3, // is this the right value?
/// <summary>
/// Activates the window and displays it as a maximized window.
/// </summary>
ShowMaximized = 3,
/// <summary>
/// Displays a window in its most recent size and position. This value
/// is similar to <see cref="Win32.ShowWindowCommand.Normal"/>, except
/// the window is not activated.
/// </summary>
ShowNoActivate = 4,
/// <summary>
/// Activates the window and displays it in its current size and position.
/// </summary>
Show = 5,
/// <summary>
/// Minimizes the specified window and activates the next top-level
/// window in the Z order.
/// </summary>
Minimize = 6,
/// <summary>
/// Displays the window as a minimized window. This value is similar to
/// <see cref="Win32.ShowWindowCommand.ShowMinimized"/>, except the
/// window is not activated.
/// </summary>
ShowMinNoActive = 7,
/// <summary>
/// Displays the window in its current size and position. This value is
/// similar to <see cref="Win32.ShowWindowCommand.Show"/>, except the
/// window is not activated.
/// </summary>
ShowNA = 8,
/// <summary>
/// Activates and displays the window. If the window is minimized or
/// maximized, the system restores it to its original size and position.
/// An application should specify this flag when restoring a minimized window.
/// </summary>
Restore = 9,
/// <summary>
/// Sets the show state based on the SW_* value specified in the
/// STARTUPINFO structure passed to the CreateProcess function by the
/// program that started the application.
/// </summary>
ShowDefault = 10,
/// <summary>
/// <b>Windows 2000/XP:</b> Minimizes a window, even if the thread
/// that owns the window is not responding. This flag should only be
/// used when minimizing windows from a different thread.
/// </summary>
ForceMinimize = 11
}
Have you tried a combination of these? 您是否尝试过这些方法的组合?
Window.Activate();
Window.Topmost = true;
Window.Topmost = false;
Window.Focus();
It's more a workaround, but it helped me a lot when the window was stuck behind something else. 这是一种解决方法,但是当窗口卡在其他物体后面时,它对我有很大帮助。
It also helped me when i got a chain of ShowDialog()
's because sometimes .NET has a weird behavior when it comes to more than one ShowDialog()
当我得到ShowDialog()
时,它也对我有帮助,因为有时.NET在涉及多个ShowDialog()
时会出现怪异的行为
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.