繁体   English   中英

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

[英]How to restore a window without giving it focus using WPF (or interop)

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

显然,只是在WPF中更改为WindowState.Normal并不会删除它,因为这会使窗口获得焦点和激活。 我还尝试了在恢复时设置HiddenIsEnabled各种组合。

我已尝试使用HWND_TOP,HWND_TOPMOST等WIN32 SetWindowPos ,但此功能不是为了恢复窗口,只会改变已经“显示”的窗口的位置。

试过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); 
    }
}

调用ShowWindow传递SW_SHOWNOACTIVATE标志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM