在SetWindowPos之后强制外部进程重绘边框

时间:2015-01-06 13:27:01

标签: c# process border redraw window-position

我只是想看看我是否可以制作一个位于显示器左侧的程序。

通过这样做,我使用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)窗口(在我的第一台左侧使用一种hackish类型的检查:D)

Visual Studio

Chrome

1 个答案:

答案 0 :(得分:0)

我认为你误解了你在那里看到的东西:边框没有绘制,因为(在移动它们之前)最大化的窗口。最大化的窗口通常在Windows中没有边框。

解决方案是首先将它们恢复到正常状态,然后再将它们移动到所需的坐标,即

ShowWindow(i, ShowWindowCommands.Normal);

那就是说,你仍然需要处理多窗口进程和无数有趣的小挑战。享受骑行: - )。