私の最初の考えを以下にリストしましたが、あなたが述べたように、それGetWindowRect
が間違った値を返していることが確実な場合は、さらに下の解決策を参照してください。
GetSystemMetrics(SM_CXBORDER)
「との何が問題なのGetSystemMetrics(SM_CYBORDER)
ですか?
あなたが使用している方法は、それを行うための非常に回りくどい方法のようです. を呼び出すことができれば、同様GetWindowRect()
に呼び出すことができると確信GetSystemMetrics()
しています.
もう 1 つの可能性は、 を使用GetWindowRect
して、ウィンドウの境界四角形全体をGetClientRect
取得し、クライアント (非境界) 領域の境界四角形を取得することです。
これにより、 とそれぞれのようなものが得られ、上部の境界線を、下部を、左を、右を(27,12,12,12) として計算できます。(100,200),(1000,900)
(112,227),(988,888)
227-200
900-888
112-100
900-888
解像度:
少し調査すると、これが判明します。から正しい値を取得できない可能性があると述べている 2006 年のスレッドですGetWindowsRect
。これを指摘したスレッドは次のように述べています。
WINVER=6 でリンクされていない Vista の下のアプリは、Vista Aero がウィンドウに適用する「ガラス」ピクセルの余分なパディングを考慮していない、誤解を招く一連の値をここで受け取ります。これは、サイズの一貫性を維持するために、Aero Basic (Glass なし) でも発生するようです。回避策 (WINVER=6 を設定したくない場合) は、dwmapi.dll に動的にバインドし、GetProcAddress() を使用して DwmGetWindowAttribute() 関数を取得し、DWMWA_EXTENDED_FRAME_BOUNDS 引数を指定して呼び出して、正規のウィンドウを要求するようです。フレーム寸法。
したがって、基本的には、次のようなものを使用します (Python からこれを行うには ctypes を使用する必要がある場合があります):
RECT r;
HRESULT stat = DwmGetWindowAttribute (
hwnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&r,
sizeof(r));
これにより、正しい境界矩形が得られます。