首页 > 解决方案 > WPF 应用程序引发激活事件,但应用程序未显示且未获得焦点

问题描述

我有两个应用程序。其中之一是第 3 方,它将消息发送到我的 WPF 应用程序。有两种类型的消息:“隐藏”和“显示”。

在“隐藏”时,我的应用会隐藏自己

Window window = Application.Current.MainWindow;
window.WindowState = WindowState.Minimized;
window.Hide();

相应地在“show”上显示为:

Window window = Application.Current.MainWindow;
if (!window.IsVisible)
    window.Show();
if (window.WindowState == WindowState.Minimized)
    window.WindowState = WindowState.Normal;
        
window.Activate();
window.Focus();

窗口本身已订阅激活事件。并在出现时记录“显示的应用程序”。

假设在 3rd 方应用程序中,它看起来像相应的两个按钮“显示”和“隐藏”,用户可以随时按下。这两个应用程序都在同一台显示器上工作。我的 WPF 应用程序还有一个按钮“显示 3rd 方应用程序”,以防它在前面(两个应用程序都在全屏、最顶层模式下工作)

问题是有时(没有找到原因)我的应用程序在用户第一次按下“显示”后没有显示。所以他不得不按了两次。虽然日志包含

显示的应用程序

两次,每次用户按下按钮时。

我的应用也订阅了 Deactivated 事件。每次引发事件时,它都会记录“焦点丢失”。所以我预计我的日志在两个“显示的应用程序”之间也有“焦点丢失”,因为应该在用户第二次按下“显示”按钮时激活第 3 方应用程序,因为焦点在那里......但它没有发生.

任何想法为什么?

任何想法为什么第一次没有显示应用程序?

标签: c#.netwpfwindowfocus

解决方案


我也有类似的问题,你需要强制它;

private void BringToFront(Window window) 
{
    try
    {
        window.Activate();
        window.Topmost = true;  // important
        window.Topmost = false; // important
        window.Focus();

        SystemCommands.RestoreWindow(window);

        window.Activate();
        window.Topmost = true;  // important
        window.Topmost = false; // important
        window.Focus();

    }
    catch (Exception)
    {
    }

}

推荐阅读