9

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

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

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

尝试了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); 
    }
}
4

1 回答 1

8

打电话ShowWindowSW_SHOWNOACTIVATE旗。

于 2013-04-10T13:04:50.003 回答