teratail header banner
teratail header banner
質問するログイン新規登録

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

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

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

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

Q&A

解決済

1回答

291閲覧

C# クリックしたボタンがわからない

turnberry0712

総合スコア9

C#

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

0グッド

0クリップ

投稿2025/06/20 03:17

0

0

実現したいこと

  • クリックしたボタンの種類を三つに分けたい。・右クリック ・左クリック ・それ以外

前提

ここに質問の内容を詳しく書いてください。
(例)
C#でマウスを使うプログラムを作っています。。
実装中に以下の現象が発生しました。

発生している問題

クリックしたマウスのボタンを判定できない。

ソースコード

C#

1internal class Class1 2{ 3 private void pictureBox_Number1_Click(object sender, EventArgs e) 4 { 5 //現在どのマウスボタンが押されているか調べる 6 if ((MouseButtons & MouseButtons.Left) == MouseButtons.Left) 7 { 8 Debug.WriteLine("マウスの左ボタンが押されています。"); 9 } 10 else if ((MouseButtons & MouseButtons.Right) == MouseButtons.Right) 11 { 12 Debug.WriteLine("マウスの右ボタンが押されています。"); 13 } 14 else 15 { 16 Debug.WriteLine("マウスの中央ボタンが押されています。"); 17 } 18 } 19}

C#

1namespace TEST 2{ 3 public partial class MainForm : Form 4 { 5 private void pictureBox_Number9_Click(object sender, EventArgs e) 6 { 7 MouseEventArgs button = (MouseEventArgs)e; 8 if (button.Button == MouseButtons.Left) 9 { 10 Debug.WriteLine("左クリック"); 11 } 12 else if (button.Button == MouseButtons.Right) 13 { 14 Debug.WriteLine("右クリック"); 15 } 16 else 17 { 18 Debug.WriteLine("その他"); 19 } 20 } 21 } 22}

試したこと

(現在どのマウスボタンが押されているか調べる)[https://dobon.net/vb/dotnet/system/mousebuttons.html]

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

Windows11 HOME
visualstudio2022

出力の種類:Windowsアプリケーション
ターゲットフレームワーク:.NET 9.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

Clickイベントはマウスのボタンを押して「離した」時に発生します。
なので最初のコードでは

C#

1 //現在どのマウスボタンが押されているか調べる 2 if ((MouseButtons & MouseButtons.Left) == MouseButtons.Left) 3 { 4 Debug.WriteLine("マウスの左ボタンが押されています。"); 5 } 6 else if ((MouseButtons & MouseButtons.Right) == MouseButtons.Right) 7 { 8 Debug.WriteLine("マウスの右ボタンが押されています。"); 9 } 10 else 11 { 12 Debug.WriteLine("マウスの中央ボタンが押されています。"); 13 }

実行されるタイミングではすでにボタンが離されているのでボタンが押されていないことになります。

次に

C#

1 private void pictureBox_Number9_Click(object sender, EventArgs e) 2 { 3 MouseEventArgs button = (MouseEventArgs)e; 4 if (button.Button == MouseButtons.Left) 5 { 6 Debug.WriteLine("左クリック"); 7 } 8 else if (button.Button == MouseButtons.Right) 9 { 10 Debug.WriteLine("右クリック"); 11 } 12 else 13 { 14 Debug.WriteLine("その他"); 15 } 16 }

このようにした場合ですが、イベントの引数として受け取ったeをMouseEventArgsにキャストして情報を取得することができ、処理も正常に動作すると思います。
ただClickイベントの引数のeにマウス情報が必ず含まれるといったドキュメントがないためにいつ使えなくなるかが分かりません。(以前からこうなので修正されない可能性もありますが)

ですからこういった場合はMouseClickイベントを使用するのがいいでしょう。

C#

1 private void pictureBox1_MouseClick(object sender, MouseEventArgs e) 2 { 3 4 if (e.Button == MouseButtons.Left) 5 { 6 Debug.WriteLine("マウスの左ボタンが押されています。"); 7 } 8 else if (e.Button == MouseButtons.Right) 9 { 10 Debug.WriteLine("マウスの右ボタンが押されています。"); 11 } 12 else 13 { 14 Debug.WriteLine("マウスの右左以外のボタンが押されています。"); 15 } 16 }

投稿2025/06/20 04:08

編集2025/06/20 04:34
YAmaGNZ

総合スコア10641

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

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

turnberry0712

2025/06/20 06:23

回答ありがとうございます。 試したところ問題が解決しました! ただ、手動で「EventArgs e」を「MouseEventArgs e」に変えると「MainForm.Designer.cs 」でエラーが発生してしまいます。どのように対処したら良いのかご教授ください。
YAmaGNZ

2025/06/20 06:37

private void pictureBox_Number1_Click(object sender, EventArgs e) というイベントハンドラを書いていてコンパイルが通っている状態のものを手で private void pictureBox_Number1_Click(object sender, MouseEventArgs e) と書き換えたということで合っていますか? イベントハンドラに関してはデザイナ上やプロパティグリッドから設定した場合は自動でコードがDesigner.csに埋め込まれます。 なので、手でそのイベントハンドラを変更してしまうとDesigner.csにあるコードと不整合が起こってしまいエラーとなります。 なのでイベントを変更したりする場合はプロパティグリッドを利用するようにしてください。
turnberry0712

2025/06/20 06:43

回答ありがとうございます。試してみましたが解決できませんでした。 プロパティグリッドを利用しました。 private void test_Click(object sender, MouseEventArgs e) を作成しましたが、プロパティグリッドから表示されることができませんでした。 名前が同じ関数を作ろうとすると、EventArgs eのほうで作ってしまうのでマウスが使えないほうになってしまいます。 この場合どの辺りに原因がありそうでしょうか?
YAmaGNZ

2025/06/20 07:03

Clickイベントのイベントハンドラを作成するときに引数としてMouseEventArgsと変更したいということですか? もしそうなのであれば、Clickイベントの引数はEventArgsなのでこれを変更することはできません。 私が提案したのは「MouseClickイベント」でClickイベントとは別物です。
turnberry0712

2025/06/20 07:10

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問