2012-01-09 29 views
0

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

OS 7(64)は、C++

それは "キャレット" と呼ばれている
+1

これは私にはほとんど意味がありません。ボタンクリックはボタンに起こり、位置に依存しません。また、ボタンにはキャレットがありません(カーソルが点滅しています)。あなたの質問への直接的な答えは、フォーカスがプロセスによって保持されているときに 'GetFocus'を呼び出すか、それが別のプロセスにある場合は' GetGUIThreadInfo'を呼び出すことです。あなたの基本的な目標が何であるかを説明できる方が良いかもしれません。その動機づけは何ですか? –

+0

複数のコードをテストしているときに、これらのテキストコードをメモ帳++に入れて、オートホットキーの操作をほとんどしないでメモ帳++のショートカットに送信して、すべてのテキストを選択してビジュアルスタジオプロジェクト.cppファイルにコピーします。その後、auothokeyはこれらのコードをコンパイルして実行します。だから私は2つのコマンドを送信し、1つはすべてを選択し、2つ目はコピーです。あなたのキャレットがテキストの一番上になるすべてのテキストを選択すると問題が発生します。キャレットを置くポイントは、あなたが最後に止まった場所を自分で見つける必要がないということです。 –

答えて

2

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

これは、Win32のキャレット関数、特にSetCaretPos()を使用するアプリケーションでのみ機能することに注意してください。アプリケーションがこれらを使用せずに独自のキャレットを描画する場合、意味のあるものは戻ってこないかもしれません。 (Wordのようなアプリケーションの中には独自のキャレットを描画しますが、キャレットを追跡する必要があるアクセシビリティ補助機能でこのテクニックを使用できるように、SetCaretPosを呼び出すこともあります)。

戻る矩形は実際のキャレットよりも広いことがあります。ビットマップがキャレットに使用されている場合、上部に小さな「フラグ」が付いた右から左または左から右のキャレットの場合のように、ビットマップの幅が少し広い実際のキャレット領域を調整したり、実際のキャレットバーがこの領域内のどこにあるかを把握する必要があります。正確な中間にある場合とそうでない場合があります。 Notepad ++のように見えますが、あなたはうまくいくはずです。

4

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

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

UIPI(UACのユーザーインターフェイスコンポーネント)は、昇格したプロセスが所有するウィンドウを突き抜けないように注意してください。

+0

何らかの理由で、GetForegroundWindowとGetCaretPosを使用すると常にxとyの値が0になる場合、いくつかのアドバイスがありますか? –

+0

IIRC、GetCaretPos()は、呼び出しスレッドのキャレット位置を取得します(HWNDなどのパラメータはありません)。私はあなたが別のスレッドやアプリケーションからキャレットの位置を取得するために使用できるとは思わない。その場合、GetGUIThreadInfoを使用できます。 – BrendanMcK

関連する問題