我需要恢复(“取消最小化”)一个已创建的WPF窗口,但当前在顶部的窗口(不一定是WPF)不能失去焦点或激活。我已经尝试了所有我能找到的WIN32函数,但都没有成功。现在变得非常沮丧,真的很感谢任何提示和建议。
显然,仅在WPF中更改为WindowState.Normal并不够,因为这会使窗口获得焦点和激活。在恢复时,我还尝试了各种组合,包括设置Hidden和IsEnabled。
我尝试使用HWND_TOP、HWND_TOPMOST等WIN32 SetWindowPos,但该函数不旨在恢复窗口,而且只会更改已“显示”的窗口的位置。
尝试过WIN32 ShowWindow和SetWindowPlacement,但也没有帮助。我试图添加HwndHook来尝试侦听WM_SETFOCUS并将焦点恢复到原始窗口,但我只得到了上一个聚焦窗口句柄的零。
编辑 - 从Joel Lucsy得到的窗口扩展解决方案:
显然,仅在WPF中更改为WindowState.Normal并不够,因为这会使窗口获得焦点和激活。在恢复时,我还尝试了各种组合,包括设置Hidden和IsEnabled。
我尝试使用HWND_TOP、HWND_TOPMOST等WIN32 SetWindowPos,但该函数不旨在恢复窗口,而且只会更改已“显示”的窗口的位置。
尝试过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);
}
}