Мои первые мысли были перечислены ниже, но если, как вы утверждаете, вы уверены, что GetWindowRect
возвращает неправильные значения, см. РАЗРЕШЕНИЕ далее.
"Что не так с GetSystemMetrics(SM_CXBORDER)
и GetSystemMetrics(SM_CYBORDER)
?
Метод, который вы используете, кажется очень окольным, и, если вы можете позвонить GetWindowRect()
, я вполне уверен, что вы также можете вызвать GetSystemMetrics()
.
Еще одна возможность - использовать GetWindowRect
, чтобы получить весь ограничивающий прямоугольник для окна, и GetClientRect
, чтобы получить ограничивающий прямоугольник для клиента (без границ). площадь.
Это должно дать вам что-то вроде (100,200),(1000,900)
и (112,227),(988,888)
соответственно, и вы можете установить верхнюю границу как 227-200
, нижнюю как 900-888
, слева как 112-100
и справа как 900-888
(27,12,12,12).
Решение:
Небольшое расследование обнаруживает это . Это тема 2006 года, в которой говорится, что вы не можете получить правильные значения из GetWindowsRect
. Тема, которая указала мне на это, гласила:
Приложения под Vista, которые не связаны с WINVER = 6, получат здесь вводящий в заблуждение набор значений, которые не учитывают дополнительное заполнение «стеклянных» пикселей, которые Vista Aero применяет к окну. Похоже, что это происходит даже в Aero Basic (без стекла), чтобы сохранить согласованность размеров. Обходной путь (если вы не хотите устанавливать WINVER = 6), по-видимому, заключается в том, чтобы динамически связываться с dwmapi.dll и использовать GetProcAddress () для получения функции DwmGetWindowAttribute () и вызывать ее с аргументом DWMWA_EXTENDED_FRAME_BOUNDS для запроса подлинного окна размеры рамы.
Так что, по сути, используйте что-то вроде (возможно, вам придется использовать ctypes, чтобы сделать это из Python):
RECT r;
HRESULT stat = DwmGetWindowAttribute (
hwnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&r,
sizeof(r));
и это должно дать вам правильный ограничивающий прямоугольник.