【问题标题】:How do I prevent Window resizing when the Workstation is Locked then Unlocked?当工作站锁定然后解锁时,如何防止窗口调整大小?
【发布时间】:2010-12-25 07:05:57
【问题描述】:

我们有一个在多显示器环境中运行的应用程序。用户通常会将应用程序对话框展开以跨越多个显示器。

如果用户锁定工作站,然后将其解锁,我们的应用程序会被告知调整大小。

我们的用户觉得这种行为令人沮丧,因为他们会花一些时间来恢复以前的布局。

我们还不确定是图形驱动程序请求调整大小还是 Windows。希望通过这个问题,可以更清楚哪个组件负责,

(文件)资源管理器和 Firefox 等流行应用程序在此设置中的行为方式相同。仅复制:

  1. 打开资源管理器 (Win+E)
    • 将资源管理器窗口拖动到水平大于 1 个屏幕
    • 锁定工作站 (Win+L),
    • 解锁
    • 应用程序现在应该调整为仅在 1 个屏幕上显示

当工作站被锁定然后解锁时,如何防止窗口调整大小?
我们是否需要对(取消)锁定的检查进行编码?
还有其他我们不知道的机制吗?

【问题讨论】:

  • 谁能推荐一些其他适合在 Windows 上进行多显示器工作的人的 Stack Overflow 标签?

标签: windows user-interface multiple-monitors


【解决方案1】:

在调整窗口大小之前,应用程序将从 Windows 获得WM_WINDOWPOSCHANGING 消息。您可以拦截该消息并更改参数,从而强制窗口保持不动。您需要小心,因为当用户尝试移动或调整窗口大小时,您会收到相同的消息。也可能在最大化或最小化时。

编辑:您可以使用WTSRegisterSessionNotification function 获取更多消息。这些消息旨在用于快速用户切换,但锁定屏幕在 Windows 中作为系统会话实现。

【讨论】:

    【解决方案2】:

    类似的问题有答案,可以restore window size in a .net application after the session is unlocked

    有人在 SuperUser 上提出了基本相同的问题,但从您用户的角度来看:How can I stop big windows from resizing when I lock my workstation?

    【讨论】:

      【解决方案3】:

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

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

      我还不能让它在 WPF 应用程序中工作,因为 WPF 没有 ResizeEnd 的等价物(或者我还没有找到)并且订阅了 SizeChangedLocationChanged不够好,因为当计算机被锁定以及覆盖大小和位置时会触发这些。

      最后我不得不挂钩到 Windows ExitSizeMove 事件来保存当前的大小和位置。如何挂钩此事件的详细信息可以找到here

      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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多