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

Nic*_*las 8 c# wpf winapi

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

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

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

试过WIN32 ShowWindow,SetWindowPlacement但也没有运气.试图添加一个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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*csy 7

呼叫ShowWindow传递SW_SHOWNOACTIVATE旗帜.