如何使用WPF(或互操作)恢复窗口而不给它焦点

本文关键字:窗口 焦点 恢复 WPF 何使用 互操作 | 更新日期: 2023-09-27 18:08:21

我需要恢复("取消最小化")一个已经创建的WPF窗口,但当前在顶部的窗口(不一定是WPF) 不能失去焦点或激活。我试过使用我能找到的所有WIN32功能,但无济于事。现在真的很沮丧,非常感谢任何指导和提示。

显然,仅仅在WPF中更改为WindowState.Normal并不能削减它,因为这使得窗口接收焦点和激活。我还尝试了各种组合设置HiddenIsEnabled,同时恢复。

我已经尝试了WIN32 SetWindowPos与HWND_TOP, HWND_TOPMOST等,但此功能不打算恢复窗口,只会改变已经"显示"窗口的位置。

尝试WIN32 ShowWindowSetWindowPlacement,但也没有运气。我尝试添加一个HwndHook来尝试监听WM_SETFOCUS并将焦点恢复到原始窗口,但我只得到零最后一个聚焦的窗口句柄。

编辑-解决方案与窗口扩展后提示从Joel Lucsy:

public static class RestoreWindowNoActivateExtension
{        
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool ShowWindow(IntPtr hWnd, UInt32 nCmdShow);
    private const int SW_SHOWNOACTIVATE = 4;
    public static void RestoreNoActivate(this Window win)
    {
        WindowInteropHelper winHelper = new WindowInteropHelper(win);
        ShowWindow(winHelper.Handle, SW_SHOWNOACTIVATE); 
    }
}

如何使用WPF(或互操作)恢复窗口而不给它焦点

调用ShowWindow传递SW_SHOWNOACTIVATE标志