Заставить внешний процесс перерисовывать границы после 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) окно на моем втором мониторе (слева от моего первого с помощью хакерской проверки:D)
1 ответ
Я думаю, что вы неверно истолковываете то, что видите там: границы не рисуются, потому что (до того, как вы их переместили) окна, где MAXIMIZED. У развернутых окон обычно нет границ в Windows.
Решение состоит в том, чтобы сначала вернуть их в нормальное состояние, прежде чем переместить их в нужную координату, т.е.
ShowWindow(i, ShowWindowCommands.Normal);
Тем не менее, вам все равно придется иметь дело с многооконными процессами и множеством забавных маленьких задач. Наслаждаться поездкой:-).