Mis primeros pensamientos se enumeran a continuación, pero si, como usted dice, está seguro de que GetWindowRect
está devolviendo valores incorrectos, consulte RESOLUCIÓN más abajo.
"¿Qué pasa con GetSystemMetrics(SM_CXBORDER)
y GetSystemMetrics(SM_CYBORDER)
?
El método que utiliza parece una manera muy indirecta de hacerlo y, si se puede llamar GetWindowRect()
, estoy bastante seguro de que puede llamar GetSystemMetrics()
también.
otra posibilidad es utilizar GetWindowRect
para obtener todo el rectángulo delimitador de la ventana y GetClientRect
para obtener el rectángulo delimitador para el área de cliente (no frontera).
Este debería darle algo así como (100,200),(1000,900)
y (112,227),(988,888)
, respectivamente, y se puede trabajar en el borde superior como 227-200
, inferior como 900-888
, izquierda y derecha como 112-100
como 900-888
(27,12,12,12).
RESOLUCIÓN:
Un poco de investigación se convierte en imagen this. Es un hilo de 2006 que indica que es posible que no obtenga los valores correctos en GetWindowsRect
. El hilo que me señaló a este declaró:
Aplicaciones en Vista que no están vinculados con WINVER = 6 recibirá un juego engañoso de los valores aquí, que no tienen en cuenta el acolchado extra de "cristal" píxeles Vista Aero se aplica a la ventana. Esto parece suceder incluso en Aero Basic (sin Glass) para retener la consistencia del tamaño. La solución alternativa (si no desea configurar WINVER = 6) parece ser vincular dinámicamente a dwmapi.dll y usar GetProcAddress() para obtener la función DwmGetWindowAttribute() y llamarlo con el argumento DWMWA_EXTENDED_FRAME_BOUNDS para solicitar la ventana genuina dimensiones del marco.
Así que, básicamente, usar algo como (puede que tenga que utilizar ctypes hacer esto desde Python):
RECT r;
HRESULT stat = DwmGetWindowAttribute (
hwnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&r,
sizeof(r));
y que debería darle el rectángulo de delimitación correcta.
Bueno, devuelve 1. 1 no es el ancho de ninguno de los bordes en esa ventana. Estoy bastante seguro de que los valores que quiero para esa ventana son 8 y 30. –
¿Cómo se obtienen 8 y 30? El marco de aspecto correcto parece tener el mismo ancho en la parte inferior que en los laterales. – paxdiablo
Me importa la parte superior, también. –