- - PR -
C# グローバルフックでメッセージを編集して送り返す。
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-28 09:39
うーん質問を変えさせていただきます。
この質問にいたった理由が以下のような流れです。 マウスジェスチャーをしたい ↓ ガジェット形式なのでところどころにあるサンプルのようにウィンドウ内やウィンドウでクリックされた場合のみに動作するマウスジェスチャーでは意味がない ↓ マウスフックを使おう ↓ 低レベルマウスフックならC#でも使えた! ↓ マウスフックする場合右クリックや真ん中クリックしてるときにだけマウスジェスチャーをするのが標準らしい ↓ でも右クリックでマウスジェスチャーをすると、右クリックを離したときにメニューが表示されてしまうことがある(デスクトップとかブラウザじょうでやった場合) 真ん中クリックだとブラウザでは自動スクロールが働くことがある。 ↓ うざい ↓ 右クリックで行えば右クリックを離した時のメッセージを消してしまえばメニューが表示されないのでは?真ん中クリックはクリックしたときに動作するから無理だろう… ↓ ジェスチャーが成功した場合は右クリックを話したときのメッセージを消してしまおう ↓ どうする? ↓ フックでメッセージの編集ができるらしい ↓ 低レベルフックでできないらしい ↓ どうしよう・・・ って感じです。 ようはこの問題を解決する方法であればどのような方法でもかまわないわけです。 現状では [Ctrl]キーを押してるときにマウスジェスチャーを行う等が良い方法に思われますが、できればマウスのボタンで動作を行いたい(で、メニューとか表示されてほしくない) なにか良いアイディアありますか? _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||||||
|
投稿日時: 2007-01-29 17:09
グローバルフックくらいしかないです。 | ||||||||||||
|
投稿日時: 2007-01-29 17:43
やっぱりorz
まずはUnmanaged C++とManaged C++とC#の相互間の動作の勉強とグローバルフックについてももっと詳しい知識の収集ですねorz いや、でもいろいろ参考になりました。ありがとうございました *^^ _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||||||
|
投稿日時: 2007-01-29 21:03
どうもいろいろ試してみたんですが上手に行きません。
危険性を考慮しても試して見たかったのでC++でDLLを書いてC#で呼び出してみました(C++はほとんどわからないので先のものを参考に書きました。) 下記がC++のコードです。
でC#
このようにしてC#からC++の関数を呼び出してます。 WH_MOUSE_LLならグローバルフックできるんですが(こんなことしなくてもできるんだからできるか) WH_MOUSEだとローカルフックしかできません(ウィンドウ外にマウスが出るとフックが止まる) DLLはネイティブでコンパイルされたDLLなはずなんでグローバルフックも動くものだと思っていたのですが…なにかコードに問題点等ありますか? _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||||||
|
投稿日時: 2007-01-29 22:00
解決。
userHookProc(code, wparam, lparam); で.NET呼び出してるのがだめらしいですねorz こんなんドウでしょうか? 1 作成時にWindow Handleを渡しておく 2 フック時にそこにメッセージを送信。 3 メッセージをゲットしたウィンドウがDLLに対してメッセージを送信 4 それを見てDLLで処理を行う。 3がちょっとまだわからないんですがorz GetMessageとかですか?それともウィンドウをメッセージ取得用に作成する必要がありますか? ほかSocket通信とかでもいけそうですね*^^ _________________ 有末 清華 crazy(){for;;{you();}} - プログラマの覚書 | ||||||||||||
|
投稿日時: 2007-01-30 00:00
出来なくはないです。が、
もフックされることをお忘れなく。
ウィンドウメッセージを受け取るならウィンドウは必要です。 それと、PostMessage() されたメッセージを受け取るにはメッセージループが必須です。 SendMessage() されたメッセージだけを受け取るなら、メッセージループは無くてもなんとかなります。 |
«前のページへ
1|2|3