强制外部进程在 SetWindowPos 之后重绘边框
Force external process to redraw borders after SetWindowPos
我只是想看看是否可以制作一个位于显示器左侧的程序。
通过这样做,我使用 BackgroundWorker 循环遍历所有用户进程(带有 MainWindowTitle 的用户进程)并使用 SetWindowPos 根据我的侧边栏移动和调整它们的大小。
这一切都很好,除了它导致不绘制边框(我想这是解释它的一种方式)。
我附上了 2 张图片,如您所见,边框似乎没有绘制(并且 Visual Studio 它不会根据应用程序 BorderStyle 调整大小)
这是我目前的代码:
foreach (Process p in Process.GetProcesses())
{
if (p.MainWindowTitle == "") continue;
if (p.MainWindowTitle.ToLower().Contains("studio"))
{
IntPtr i = p.MainWindowHandle;
RECT r;
GetWindowRect(i, out r);
if (r.Left <= -1608)
SetWindowPos(i, HWND.Top, Screen.AllScreens[1].Bounds.Left + 200, Screen.AllScreens[1].Bounds.Top, Screen.AllScreens[1].Bounds.Width - 200, Screen.AllScreens[1].Bounds.Height, SetWindowPosFlags.SWP_NOACTIVATE);
}
}
如您所见,我只是想在我的第二台显示器(在我的第一台显示器的左侧使用一种骇人听闻的方式)上调整任何(目前只是 Visual Studio)window检查 :D)
我认为您误解了您在那里看到的内容:没有绘制边框,因为(在您移动它们之前)windows 最大化了。最大化 windows 通常在 Windows 中没有边框。
解决方法是先将它们恢复到正常状态,然后再将它们移动到所需的坐标,即
ShowWindow(i, ShowWindowCommands.Normal);
也就是说,您仍然需要处理多个 window 流程和无数有趣的小挑战。享受旅程:-).
我只是想看看是否可以制作一个位于显示器左侧的程序。
通过这样做,我使用 BackgroundWorker 循环遍历所有用户进程(带有 MainWindowTitle 的用户进程)并使用 SetWindowPos 根据我的侧边栏移动和调整它们的大小。
这一切都很好,除了它导致不绘制边框(我想这是解释它的一种方式)。
我附上了 2 张图片,如您所见,边框似乎没有绘制(并且 Visual Studio 它不会根据应用程序 BorderStyle 调整大小)
这是我目前的代码:
foreach (Process p in Process.GetProcesses())
{
if (p.MainWindowTitle == "") continue;
if (p.MainWindowTitle.ToLower().Contains("studio"))
{
IntPtr i = p.MainWindowHandle;
RECT r;
GetWindowRect(i, out r);
if (r.Left <= -1608)
SetWindowPos(i, HWND.Top, Screen.AllScreens[1].Bounds.Left + 200, Screen.AllScreens[1].Bounds.Top, Screen.AllScreens[1].Bounds.Width - 200, Screen.AllScreens[1].Bounds.Height, SetWindowPosFlags.SWP_NOACTIVATE);
}
}
如您所见,我只是想在我的第二台显示器(在我的第一台显示器的左侧使用一种骇人听闻的方式)上调整任何(目前只是 Visual Studio)window检查 :D)
我认为您误解了您在那里看到的内容:没有绘制边框,因为(在您移动它们之前)windows 最大化了。最大化 windows 通常在 Windows 中没有边框。
解决方法是先将它们恢复到正常状态,然后再将它们移动到所需的坐标,即
ShowWindow(i, ShowWindowCommands.Normal);
也就是说,您仍然需要处理多个 window 流程和无数有趣的小挑战。享受旅程:-).