我尝试了Leif 引用的问题中给出的解决方案,发现该SessionSwitchReason.SessionUnlock
事件似乎是在计算机被锁定之后而不是之前被触发的。这意味着窗口大小和位置已经被重置,因此调整大小失败。
因此,我不得不在计算机被锁定之前找到另一种存储当前大小和位置的方法。我唯一能做的就是订阅ResizeEnd
Winforms 应用程序并在那里更新“预锁定”大小和位置。
我还不能让它为 WPF 应用程序工作,因为 WPF 没有等效的ResizeEnd
(或者我还没有找到它)和订阅SizeChanged
并且LocationChanged
不够好,因为这些在计算机时被触发被锁定以及覆盖大小和位置。
最后我不得不挂钩到 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;
}