私の最初の考えを以下にリストしましたが、あなたが述べたように、それ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-200900-888112-100900-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));
これにより、正しい境界矩形が得られます。