特定のウィンドウがデスクトップの境界内にあるかどうかを判断するコードを書きました。
どういうわけか、うまくいきません。デスクトップの内側か外側かに関係なく、すべてのウィンドウに対してfalse
が返されます。ここで何かがひどく間違っていますが、このコードを 3 時間見つめた後でも、どこに問題があるのか わかりません。PMSG の WPARAM で送信されたポインターから RECT 構造体を読み取ろうとすると、AccessViolationException が発生します。なぜこうなった?
私のコードは次のようになり、常に false を返します。
static bool IsInBounds(HWND window)
{
DEVMODE d;
d.dmSize = sizeof(DEVMODE);
BOOL b = EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &d);
if(b == FALSE)
{
PostMessage(FindWindow(NULL, L"Window #1"), RegisterWindowMessage(L"FMSG"), (WPARAM)window, NULL);
}
RECT R;
GetWindowRect(window, &R);
POINT p = POINT();
p.x = (LONG)d.dmPelsWidth;
p.y = (LONG)d.dmPelsHeight;
PostMessage(FindWindow(NULL, L"Window #1"), RegisterWindowMessage(L"PMSG"), (WPARAM)&R, d.dmPelsWidth);
if(R.right < 0 || R.bottom < 0 || R.left > (LONG)d.dmPelsWidth || R.top > (LONG)d.dmPelsHeight)
{
return false;
}
return true;
}
編集: IsInBounds を呼び出した後、エラー番号 1400 (無効なウィンドウ ハンドル) が返されましたが、フック コールバックから戻る前にIsWindow(window)
、ハンドルがまだ有効かどうかを確認するために を呼び出しました。真実は、実際には有効なハンドルです! GetWindowRect が無効なハンドルだと言うのはどうしてでしょうか?
編集:私は、監視されたように MonitorFromWindow を試しましたが、NULL を返し、GetLastError を呼び出すとエラー番号が発生しました。もうおなじみの1400。MonitorFromWindow が暗黙的に GetWindowRect を呼び出しているようです。サイズは気にしませんが、ハンドルからウィンドウ座標を取得する別の方法はありますか?