Заставить внешний процесс перерисовывать границы после 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)

Visual Studio

Хром

1 ответ

Решение

Я думаю, что вы неверно истолковываете то, что видите там: границы не рисуются, потому что (до того, как вы их переместили) окна, где MAXIMIZED. У развернутых окон обычно нет границ в Windows.

Решение состоит в том, чтобы сначала вернуть их в нормальное состояние, прежде чем переместить их в нужную координату, т.е.

ShowWindow(i, ShowWindowCommands.Normal);

Тем не менее, вам все равно придется иметь дело с многооконными процессами и множеством забавных маленьких задач. Наслаждаться поездкой:-).

Другие вопросы по тегам