【问题标题】:Bring to front inactive window将非活动窗口置于最前面
【发布时间】:2018-11-21 15:01:19
【问题描述】:

我有两个 WPF 应用程序。它们都有一个窗口,Topmost 属性设置为true。第一个应用程序的窗口是全屏窗口,第二个应用程序只占屏幕的一部分。重要的是,第二个应用程序无法激活(激活被以下代码阻止):

private const int GWL_EXSTYLE = -20;
private const int WS_EX_NOACTIVATE = 0x08000000;

[DllImport("user32.dll")]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex,int dwNewLong);
[DllImport("user32.dll")]
public static extern int GetWindowLong(IntPtr hWnd,int nIndex);

protected override void OnSourceInitialized(EventArgs e)
{
    WindowInteropHelper helper = new WindowInteropHelper(window);
    SetWindowLong(helper.Handle, GWL_EXSTYLE, GetWindowLong(helper.Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
}

当用户单击放置在第一个应用程序上的按钮时,我正在尝试将第二个应用程序置于前面。我试图通过使用SetForegroundWindow 和ShowWindow 来实现这一点,但它不起作用。有人有解决这个问题的办法吗?

【问题讨论】:

    标签: c# wpf window pinvoke topmost


    【解决方案1】:

    试试

    yourSpecificWindow.Activate();
    

    如果这不起作用,还包括

    yourSpecificWindow.TopMost = true;
    yourSpecificWindow.Focus();
    

    【讨论】:

    • 感谢您的回答,不幸的是我忘了告诉您一件重要的事情 - 我打开的第二个窗口不在同一个应用程序中,我通过Process.Start() 运行它,所以我可以'不要这样做。更新了我的问题。
    • 那么你可能调用带有命令行参数的第二个应用程序是使用那些调用上述方法?
    • 它仍然无法工作,因为窗口的激活被阻止了。
    • 即使您使用命令行参数调用其他应用程序?
    • 要明确一点:当我启动第二个应用程序时,它会在屏幕顶部打开,一切都很好。之后,当我点击第一个应用程序时,第二个在它下面。正如我之前所说,我正在尝试重新激活它(再次发送到顶部),但没有任何效果。作为现在的解决方法,我只是关闭第二个应用程序并在需要重新激活它时再次打开它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多