お世話になります。VC++6.0 MFCで開発を行っています。先日からフックについて質問
させて頂いている者です。現在マウスフックとキーボードフックを行っているのですが
各フックについて2点の質問があります。
i) マウスフックを行いデスクトップ上でマウスがクリックされた時に その座標を
DrawTextで表示させています。マウスアップ時に画面を更新させDrawTextで書かれた文
字列を消していますが、アプリなどのウィンドウ上でクリックした場合 表示はできま
すが消すことができません=> デスクトップにPostMessage()しているためです。
デスクトップ上に表示されているすべてのウィンドウを更新するいい方法は何かあり
ませんでしょうか??EnumWindowを使うのがいいのでしょうか??
ii) キーボードフック時で 「0」-「9」のテンキーが押されるとメッセージを表
示させているのですが イベントが2回くるのでメッセージが2回表示されてしまいま
す。2回イベントがくるのは コーディングミスでしょうか??それとも2回くるもので
それをこちらで規制すべきなのでしょうか??
長々すいませんが ご教授よろしくお願いします。
> 2回イベントがくるのは コーディングミスでしょうか??それとも2回くるもので
それをこちらで規制すべきなのでしょうか??
KeyDown と KeyUp で1回ずつ来てるんじゃない?
デスクトップの再描画なら
InvalidateRectやRedrawWindowでできると思うけど
画面がちらつくかも。
デスクトップ上に直接描いていてこれらの方法が有効なら
ブラウザ上で動くフラッシュなど再描画が頻繁に起こる
場所にはうまく描画できないかもしれません。
ii)については発生しているイベントが同じものなんでしょうか。
もしかしたらイベントが発生しているウインドウの方が違うのかも??
シャノンさん。subaruさん。ご解説ありがとうございます。
1点、私の質問に間違いがありました。
>マウスがクリックされた その座標をDrawTextで表示させています。
DrawText() ⇒ TextOut()です。自作メソッド名を書いてしまいました。
>KeyDown と KeyUp で1回ずつ来てるんじゃない?
まさしくその通りでした。きちんとKeyDownとKeyUpの判別をしてやれば 問題なく対
処できました。
>デスクトップの再描画ならInvalidateRectやRedrawWindowでできると・・・
たしかにデスクトップの再描画はできますが、それだとデスクトップ上に表示されて
いるウィンドウは再描画されないのです。私の行いたい処理は
デスクトップの再描画 + デスクトップに表示されているウィンドウすべての再描画
といった感じです。私の説明不足で申し訳ありませんでした。これは EnumWindow()使
うのが一番早いのでしょうかね・・・??
> デスクトップの再描画 + デスクトップに表示されているウィンドウすべての再描画
>といった感じです。
InvalidateRectはAPIの方です。
RedrawWindowならRDW_ALLCHILDRENフラグを含めてください。
subaruさん。ありがとうございます。
RedrawWindow()を用いて画面の再描画ができ、TextOut()で描いた座標値もきれい消す
ことができました。これでかなり作業が進みました。ありがとうございます。
また 何かありましたらよろしくお願いします。