1

c++から、ウィンドウの点滅カーソル位置を見つける方法は? 多くの場合、点滅カーソルの位置で送信ボタンをクリックする必要がありますが、それを処理する重要な機能が見つかりませんでした。

OS 勝利 7(64)、C++

4

2 に答える 2

5

「キャレット」と呼ばれ、カーソルはマウスポインタです。GetCaretPos() を使用してその位置を取得します。ただし、返される位置は、キャレットを所有するウィンドウのクライアント領域に対して相対的です。これはおそらく、最初にそのウィンドウを見つける必要があることを意味します。そのために GetForegroundWindow() を使用します。また、ボタン クリック メッセージを送信しないでください。メッセージは投稿されるため、PostMessage() を使用します。

SendInput() を使用するだけで、これらすべてを回避できます。

UIPI (UAC のユーザー インターフェイス コンポーネント) により、昇格されたプロセスが所有するウィンドウに何かを突っ込むことができないことに注意してください。

于 2012-01-09T16:31:32.543 に答える
3

GetGUIThreadInfo()がおそらく最善の策です。idThread = 0 で渡して現在アクティブなスレッドから情報を取得し、返された GUITHREADINFO 構造体の rcCaret メンバーを確認します。次に、ClientToScreen() を hwndCaret 値と共に使用して、クライアント相対座標を画面座標に変換する必要があります。

これは、Win32 キャレット関数 (具体的には SetCaretPos()) を使用するアプリでのみ機能することに注意してください。アプリがこれらを使用せずに独自のキャレットを描画すると、意味のあるものが返されない可能性があります。(Word などの一部のアプリは、独自のキャレットを描画しますが、SetCaretPos を呼び出して、キャレットを追跡する必要があるアクセシビリティ支援がこの手法を使用できるようにします)。

返される長方形は、実際のキャレットよりも広い場合があります。キャレットにビットマップを使用すると、上部に小さな「フラグ」が付いた右から左または左から右のキャレットの場合のように、より少し広い長方形が返されます。実際のキャレット領域であり、実際のキャレットバーがこの領域内のどこにあるかを調整または把握する必要がある場合があります-正確な中央にある場合とない場合があります。ただし、Notepad ++の場合は問題ないようです。

于 2012-01-10T11:10:35.747 に答える