現在、C++でマウスのクリックを検知するプログラムを作っております。
現在は、https://vcpptips.wordpress.com/tag/vk_rbutton/を参考にして
VK_LBUTTONやVK_RBUTTONが押されたかどうかによってクリック検知するようにしているのですが、
この方法では「非アクティブなウィンドウをクリックし、アクティブに切り替える」場合のクリックの検知ができません。(ウィンドウAがアクティブなときにウィンドウBをクリックしたときなど)。
そのような場合のクリックでも検出する方法ないでしょうか?
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ちょっとシチュエーションが正確にわからないのですが、別プロセスで動作している非アクティブウィンドウをクリックした際のイベントを検知をしたいということでしょうか?
だとすると、Chironianさんが書かれているようにグローバルフックを使ってマウスイベントをフックする方法か、RegisterWindowMessage関数を使って、共通のメッセージで通知することになります。
非アクティブウィンドウを出しているアプリケーションのソースを修正できる場合であれば、RegisterWindowMessage関数を使って、やり取りするメッセージを共通化しておくのが判りやすいと思います。
それができない場合、グローバルフックを使って、マウスイベントを取得して何らかの処理をさせるしかないと思います。
自プロセスで動作しているのであれば、クリックされるウィンドウでクリックイベントのハンドラを書いて、別ウィンドウにSendMessageやPostMessage系の関数を使ってメッセージを投げるなどして通知してやればいいと思います。
投稿2015/12/12 15:02
総合スコア3041
0
こんにちは。
もし、メッセージ・ループが触れるところにあれば、GetMessage()で返却されたウィンドウ・メッセージを処理するのが比較的簡単と思います。GetMessage()関数が呼ばれてないか探してみてください。
ない場合は、恐らくMFCやQt等のGUI開発ツールを使われていると思います。その場合は、そのGUI開発ツールにお望みの機能がないか探してみることをお薦めします。ここで聞けばどなたか答えてくれるかも。(ごめんなさい。私は把握していないのです。)
それもない場合は、SetWindowsHookEx()を使えばできる筈です。ここに参考になる記事がありました。でも、これはかなり難しいです。
投稿2015/12/12 14:17
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/13 00:53 編集
2015/12/13 12:26
2015/12/13 12:37
0
ベストアンサー
どういうことをするのか判らなかったため様子を見ていたのですが、お二人の回答へのコメントでだいたい判りました。
GetKeyState関数は関数呼び出し時点のキーやマウスボタンの状態を取得できますが、同様にGetCursorPos関数で呼び出し時点のマウスカーソル座標を取得できます。そして、WindowFromPoint関数で指定した座標位置にあるウィンドウのハンドルを所得できます。
これらを組み合わせて、一定間隔で取得した情報を記録するようなコードを書けば、リアルタイムにマウスボタンとマウスカーソルを追跡できます。
おまけ
SetCursorPos関数とSendInput関数を組み合わせて、記録したマウス操作を再現することもできます。
投稿2015/12/13 01:36
編集2015/12/13 01:50総合スコア5938
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/12/12 16:07