質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2209閲覧

C#によるマウスジェスチャ作成における課題(コンテキストメニューの非表示)

aaa1031

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/01/21 14:52

編集2019/01/21 14:54

前提・実現したいこと

かざぐるマウスが好きでしたが、開発停止により今後バージョンアップの見込みなしです。
なので、自分でつくってみるか!と一念発起し、はや1年が立ちました。
現状、グローバルフックを利用し、デスクトップにマウスで線を描くところまで到達しました。

発生している問題・エラーメッセージ

ジェスチャの起点を右クリックにしているため、右クリック押し+マウス移動により線を描写する
→右クリックを離すとしたとき、デスクトップ上にコンテキストメニューが表示されます。
コンテキストメニューを表示しない方法はありますでしょうか?

該当のソースコード

↓GITHUBのリポジトリを参照します。IDEはVisual Studio、言語はC#です。
リンク内容

試したこと

1.WinフォームのキャプチャコントロールをONにする。
↓下記アドレスの内容から、フォームをマウスクリックした状態でフォーム外までマウスを移動すれば、
コンテキストメニューが表示されないことに気づき、トライしてみました。
結論としては、動的に表示されたフォームの場合、表示後(Form.Show()後)あらためてフォームをマウスクリックする
必要があり、適用不可でした。
リンク内容

2.WndProcによるメッセージ処理
WinAPIよろしく、メッセージ処理により解決できないかと試みましたが、Windowsに対するメッセージ処理の破棄は
C#上でできないことがわかり断念しました。(C#上で定義したイベントハンドラに対しては無効にできるのですが。。。)

3.グローバルフックを利用し、CallNextHookEx関数到達前にフックを破棄することもトライしましたが、
フックチェーンが破壊されたのか、エラー(画面がフリーズする)となりました。

そもそも、C#(正確には.net)はグローバルフックをサポートしておらず、マウスメッセージも処理できないことが
わかり絶望状態です。

補足情報(FW/ツールのバージョンなど)

1.グローバルフックのコードは右記アドレスリンク内容より引用させて頂きました。
はやくこの領域に到達したいものです\(^o^)/

2.偉大なる先人は、約10年前にこの問題にぶちあたり、行方不明になりました。
このサイトを見たとき、自分は言語選択をミスったと感じました。
リンク内容

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ボタンはなしたイベントで、ジェスチャでなければメニューを開くようにすればいいのでは

投稿2019/01/21 14:57

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaa1031

2019/01/21 15:13

回答ありがとうございます。「ジェスチャであればメニューを開かない」というのが難しく、フォームを透過処理しているためか、マウスクリック(このばあいはマウスアップ)がフックを経て、最終デスクトップまで到達し、コンテキストメニューが表示されます。
y_waiwai

2019/01/21 15:16

コンテキストメニューを表示するようにさせてるから表示するわけで、コントロールのリンクさせないようにしとけば表示しないでしょ
YAmaGNZ

2019/01/21 15:36

自分で表示するメニューじゃなくて、デスクトップ上で右クリックしたときに表示されるメニューじゃないの?
y_waiwai

2019/01/21 15:41

ああ、自アプリ上のジェスチャではないのか。 それならこれではダメですね
aaa1031

2019/01/22 13:39

皆様回答いただきありがとうございます。 ご指摘のとおり、自身のアプリ外となります。
guest

0

皆様回答いただき、ありがとうございました。
結論としては、C#では私のやりたいことは実施不可と認識致しました。

投稿2019/01/27 00:57

aaa1031

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

グローバルフックをしているのでしたら、WM_LBUTTONUPイベント検出時、
独自の処理を行う場合はWM_LBUTTONUPイベント自体を削除して無かったことにすれば良いのではないでしょうか?
(削除の方法は調べてください)

投稿2019/01/22 01:37

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaa1031

2019/01/22 13:42

回答いただきありがとうございます。 自身のイベントに起因した処理であれば、WinProcによるメッセージ処理で対応できるのですが、 デスクトップ上におけるコンテキストメニューの表示はWindows OSの機能ですので、マウスメッセージを改変あるいは破棄する必要があると考えています。 しかしながら、.netはグローバルフックをサポートしていないため、上記内容ができないというのが 私の見解です。 (低レベルのマウスフックのみ可能)
takabosoft

2019/01/23 00:58

WH_MOUSE_LLでも、フックプロシージャの中でCallNextHookExを呼んだあと、return 1;などとして伝播を止めればマウスイベントのデフォルトの動きを阻止できませんか? (この辺、公式な資料はなさそうなので裏技になるかもしれません)
aaa1031

2019/01/23 17:27

回答いただきありがとうございます。 ご提案頂きました方法ですが、伝播を止めましたところ、フックチェーンが壊れるためかソフト上でエラー(動作が鈍くなり、ソフトウェアが強制終了する)となります。
takabosoft

2019/01/24 00:43

手元でもやってみました。コンテキストメニューの阻止自体はできましたが、その後のマウスの反応がおかしいので、この手はダメそうですね。 この辺の研究や検証はできればC#ではなくC++でやることをオススメします。 (ネイティブのAPIを叩くのはC++の方が楽だと思いますので)
aaa1031

2019/01/24 14:06

回答ありがとうございます。 やはり言語選択をミスりましたか。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問