如何防止工作站锁定解锁时窗口大小调整?

5
我们有一个应用程序在多监视器环境中运行。用户通常会将应用程序对话框展开以跨越多个显示器。
如果用户锁定工作站,然后解锁它,我们的应用程序就会被告知调整大小。
我们的用户发现这种行为很令人沮丧,因为他们需要花费一些时间来恢复先前的布局。
我们还不确定是图形驱动程序请求调整大小还是Windows。希望通过这个问题,能够更清楚地了解哪个组件负责此操作,
像(文件)资源管理器和Firefox等流行应用程序在这种设置中的行为方式相同。要复制,请执行以下操作:
1. 打开资源管理器(Win+E) 2. 将资源管理器窗口拖动到水平方向大于1个屏幕 3. 锁定工作站(Win+L) 4. 解锁 5. 应用程序现在应该调整为仅在1个屏幕上
如何在工作站被锁定并解锁时防止窗口调整大小?我们是否需要编写检查(解)锁定的代码?还有其他我们不知道的机制吗?

有人能推荐一些其他的 Stack Overflow 标签,以便联系到在 Windows 上进行多显示器操作的人吗? - Terry
3个回答

1

我尝试了Leif提到的问题中给出的解决方案,发现SessionSwitchReason.SessionUnlock事件似乎是在计算机被锁定后而不是之前触发的。这意味着窗口大小和位置已经被重置,因此调整大小失败。

因此,在计算机被锁定之前,我必须找到另一种存储当前大小和位置的方法。我唯一能想到的就是订阅Winforms应用程序的ResizeEnd并在那里更新“预锁定”大小和位置。

我还没有能够使它适用于WPF应用程序,因为WPF没有ResizeEnd的等效项(或者我还没有找到),订阅SizeChangedLocationChanged也不够好,因为这些事件在计算机被锁定时也会触发,从而覆盖大小和位置。

最终我不得不钩入Windows的ExitSizeMove事件来保存当前的大小和位置。有关如何钩入此事件的详细信息可以在这里找到:
private const int WM_EXITSIZEMOVE = 0x232;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
    source.AddHook(new HwndSourceHook(WndProc));
}

private IntPtr WndProc(IntPtr hwnd, int msg,
                       IntPtr wParam, IntPtr lParam, ref bool handled)
{
    if (msg == WM_EXITSIZEMOVE)
    {
        // save location and size of window

        handled = true;
    }

    return IntPtr.Zero;
}

1

1
在窗口调整大小之前,应用程序将从Windows接收到WM_WINDOWPOSCHANGING消息。您可以拦截该消息并更改参数,强制窗口保持不动。您需要小心,因为当用户尝试移动或调整窗口时,您将收到相同的消息。可能还有在最大化或最小化时。 编辑:您可以使用WTSRegisterSessionNotification函数获取其他消息。这些消息旨在用于快速用户切换,但锁定屏幕在Windows中实现为系统会话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接