我编写了一个简单的 C# 程序,它将打开的窗口的位置和大小保存到一个文件中,然后还可以从该文件中恢复它们(基于命令行参数)。这总是适用于某些程序而不适用于其他程序,我不知道为什么。
获取窗口位置 (x,y) 和大小 (w,h) 的部分使用此标准 Windows 函数
WINDOWPLACEMENT placement = GetWindowPlacement(windowCaption);
设置窗口大小和位置的部分使用这个标准的 Windows 函数
SetWindowPos(target_hwnd, IntPtr.Zero, wi.x, wi.y, wi.w, wi.h, 0);
这些在代码中声明如下
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd,
IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);
其余的代码是不起眼的:将一些数据保存到文本文件中,从文本文件中读取一些数据。所有这些都是从在线示例中复制粘贴的,我是新手 C#/Windows 程序员。
该程序在某些程序上运行良好,而在其他程序上则完全没有。我可以将 Chrome 恢复到它的大小和位置,但不能恢复 Firefox,也不能恢复 Microsoft Edge。Visual Studio Code 有效,但 R Studio 无效。这让我很惊讶,因为(对 Windows 编程了解不多)我预计任何 Windows 程序的 GUI 部分都是用标准 Windows 库编码的,因此任何在 Windows 上运行的程序都会以SetWindowPos
相同的方式响应。
为什么这适用于某些程序而不适用于其他程序?
我需要这样做,因为我有一个 4K 显示器,并且每次显示器关闭或超时时,Windows 都会以某种方式丢失大多数窗口的大小和位置。我单独发布了这个,没有解决方案,所以我写了自己的,这主要是有效的。 https://superuser.com/questions/1513288/windows-loses-window-position-on-large-monitor
如果有人感兴趣,源代码在 https://github.com/radumanolescu/WinPos
在具有可靠规格的 2019 年 PC 上运行完全修补的 Windows 10 Pro。