指定されたウィンドウにマウスをクリップする非常に単純なプログラムを書いています。目に見えるウィンドウなしでシステム トレイから実行されます。同じウィンドウの複数のインスタンスが存在するため、EnumWindows()
すべてのトップレベル ウィンドウを反復処理し、それらの hwnd を と比較しGetForegroundWindow()
ます。true の場合、標準ClipCursor()
コードを実行します。 ClipCursor()
を返します。セット byは に渡されたものとまったく同じであるTRUE
と断言しました。ただし、カーソルは画面上のどこにでも自由に移動できます。RECT
GetClipCursor()
RECT
ClipCursor()
の値がウィンドウの正確な値であることを確認しRECT
ました。プログラムをリリースモードでコンパイルし、管理者権限で実行しましたが、まだ何もありません。HWND
以下のコードは、のが見つかった後に実行されるものとまったく同じですGetForegroundWindow()
。
// Get the window client area.
GetClientRect(hwnd, &rc);
// Convert the client area to screen coordinates.
POINT pt = { rc.left, rc.top };
POINT pt2 = { rc.right, rc.bottom };
ClientToScreen(hwnd, &pt);
ClientToScreen(hwnd, &pt2);
SetRect(&rc, pt.x, pt.y, pt2.x, pt2.y);
clipped = true;
ClipCursor(&rc);
RECT rect;
GetClipCursor(&rect);
assert(rect.bottom == rc.bottom);
assert(rect.left == rc.left);
assert(rect.right == rc.right);
assert(rect.top == rc.top);
煩わしくなったので (私はMessageBox()
's を使用していました)、多くのチェックを削除しましたが、このコードは、想定されているときに確実に実行されています。カーソルがクリップされないだけで、その理由がわかりません。