I miei primi pensieri erano elencati di seguito ma se, come dichiari, sei certo che GetWindowRect
restituisce valori errati, vedi RISOLUZIONE più in basso.
"Cosa c'è di sbagliato con GetSystemMetrics(SM_CXBORDER)
e GetSystemMetrics(SM_CYBORDER)
?
Il metodo che si sta utilizzando sembra un modo molto indiretto di farlo e, se si può chiamare GetWindowRect()
, sono abbastanza certo è possibile chiamare GetSystemMetrics()
pure.
Un altra possibilità è quella di utilizzare GetWindowRect
per ottenere l'intero rettangolo di delimitazione per la finestra e GetClientRect
per ottenere il rettangolo di delimitazione per la zona del cliente (non-confine).
.210
Questo dovrebbe dare qualcosa come (100,200),(1000,900)
e (112,227),(988,888)
rispettivamente, e si può lavorare il bordo superiore come 227-200
, inferiore come 900-888
, a sinistra come a destra come 112-100
e 900-888
(27,12,12,12).
Risoluzione:
Un po 'di indagini salta fuori this. È un thread del 2006 che afferma che potresti non ottenere i valori corretti da GetWindowsRect
. Il filo che mi ha segnalato questo ha dichiarato:
Apps sotto Vista che non sono collegati con WINVER = 6 riceveranno un insieme fuorviante di valori qui, che non tengono conto della chilo in più di pixel "vetro" Vista Aero si applica alla finestra. Ciò sembra accadere anche in Aero Basic (senza vetro) per mantenere la consistenza di dimensionamento. La soluzione alternativa (se non si desidera impostare WINVER = 6) sembra essere di associare dinamicamente a dwmapi.dll e utilizzare GetProcAddress() per ottenere la funzione DwmGetWindowAttribute() e chiamarla con l'argomento DWMWA_EXTENDED_FRAME_BOUNDS per richiedere la finestra originale dimensioni del telaio.
Quindi, fondamentalmente, usare qualcosa di simile (potrebbe essere necessario utilizzare ctypes per fare questo da Python):
RECT r;
HRESULT stat = DwmGetWindowAttribute (
hwnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&r,
sizeof(r));
e che dovrebbe dare il corretto rettangolo di delimitazione.
Bene, restituisce 1. 1 non è la larghezza di nessuno dei bordi di quella finestra. Sono abbastanza sicuro che i valori che voglio per quella finestra siano 8 e 30. –
Come si ottengono 8 e 30? La cornice dall'aspetto corretto sembra avere la stessa larghezza sul fondo rispetto ai lati. – paxdiablo
Mi interessa anche il top. –