GetWindowRect возвращает неправильное значение, если окно находится справа внизу - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь получить положение окна по его ручке. Затем я хочу нарисовать крестик в окнах 0, 0, вот так (блокнот находится в верхнем левом углу экрана):

how it should look

но если я переместу блокнот внизу справа, он будет выглядеть так:

enter image description here

Это совершенно странно для меня. Я зарегистрировал значения rect.Left и rect.Top и сравнил их со значениями Spy ++, они были одинаковыми.

Что я пробовал: от user32.dll:

GetWindowRect(handle, out var rect);

из dwmapi.dll:

DwmGetWindowAttribute(handle, DWMWINDOWATTRIBUTE.ExtendedFrameBounds, out var rect, size);

Это сработало немного лучше, но поведение осталось прежним.

Кто-то знает способ найти окна 0, 0 независимо от того, где находится окно?

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

наконец я сам нашел проблему.Мне пришлось установить FormWindowState обратно на Normal и FormBorderStyle на None, но не в дизайнере, а в методе InitDevice в верхней части.После этого я установил границы формы для границ экрана и все.Теперь он работает точно так же, как и ожидалось.

0 голосов
/ 23 мая 2019

Direct3D использует мировую систему координат, а GetWindowRect получает экранную координату. В этом проблема.

Нарисуйте линию другим методом, например, Graphics class:

Graphics g;
g = this.CreateGraphics();
Pen myPen = new Pen(Color.Red);
myPen.Width = 1;
g.DrawLine(myPen, point1x, point1y, point2x, point2y);

Кроме того, независимо от проблемы, строка кода в вашей ссылке:

SetWindowLong(this.Handle, GWL_EXSTYLE,(IntPtr)(GetWindowLong(this.Handle, GWL_EXSTYLE) ^ WS_EX_LAYERED ^ WS_EX_TRANSPARENT));

если вам нужны дополнения к стилю, вы должны:

SetWindowLong(this.Handle, GWL_EXSTYLE,(IntPtr)(GetWindowLong(this.Handle, GWL_EXSTYLE) | WS_EX_LAYERED | WS_EX_TRANSPARENT));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...