C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ホイールクリックした時にアクションする方法

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■89317 / inTopicNo.1)  ホイールクリックした時にアクションする方法
  
□投稿者/ tora (1回)-(2018/11/20(Tue) 11:50:50)

分類:[.NET 全般] 

VB2015を使っています。

フォームの全ての場所において
マウスのホイールクリックをした時にあるアクションを割り当てたいののですが

http://anetm.com/dev/tools/vbdotnet/112223.htm
http://rucio.a.la9.jp/main/dotnet/Samples151/Sample179MouseClick.htm

この辺りのページを参考にして、





    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseClick

        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                MsgBox("左ボタンがクリックされました。")

            Case Windows.Forms.MouseButtons.Right
                MsgBox("右ボタンがクリックされました。")

            Case Windows.Forms.MouseButtons.Middle
                MsgBox("マウスホイールがクリックされました。")

            Case Windows.Forms.MouseButtons.XButton1
                MsgBox("X1ボタンがクリックされました。")

            Case Windows.Forms.MouseButtons.XButton2
                MsgBox("X2ボタンがクリックされました。")

        End Select


    End Sub


とやってみたのですが
動作しません。

MyBaseをMeに変えてもみましたが駄目でした

FormのKeyPreviewプロパティはTrueにしてあります

一体どうすればうまくいきますでしょうか?


引用返信 編集キー/
■89321 / inTopicNo.2)  Re[1]: ホイールクリックした時にアクションする方法
□投稿者/ 魔界の仮面弁士 (1944回)-(2018/11/20(Tue) 12:17:04)
2018/11/20(Tue) 12:36:17 編集(投稿者)

No89317 (tora さん) に返信
> マウスのホイールクリックをした時にあるアクションを割り当てたいののですが

手持ちの環境では、左/中/右/X1/X2 の 5 種すべて反応しました。
マウスドライバーの問題ではないですか?


お使いのマウスが、現在使用している Windows バージョンに対して
正式に対応されているものであるかどうか、ハードウェアメーカーに
確認してみてはいかがでしょう。


-- 追伸 --

Windows 10 + Microsoft SideWinder Mouse
 OK: 左/右/X1/X2
 NG: 中(無反応) …ホイールは反応するが、中クリックには応答しない

(注) 上記は Windows 10 での動作が保証されていないマウスです。
 https://support.microsoft.com/ja-jp/help/4034170/


Windows 7 + Microsoft SideWinder Mouse
 OK: 左/中/右/X1/X2


Windows 10 + マウスコンピューター 標準 3 ボタンマウス
 OK: 左/中/右


Windows 7 + マウスコンピューター 標準 3 ボタンマウス
 OK: 左/中/右
引用返信 編集キー/
■89322 / inTopicNo.3)  Re[1]: ホイールクリックした時にアクションする方法
□投稿者/ tora (2回)-(2018/11/20(Tue) 13:04:08)
すいません、フォームの上でクリックしているつもりだったのですが
Tablelayoutpanelの上だったことに気がつきました。

ところで、この方法だとテキストボックスやラベルなど全てのコントロール上で
ホイールクリックを押した時のアクションを設定したい場合、
再帰的にAddhandlerする必要があります。

ラベルなどはこれでうまくいったのですが、
テキストボックスだけはなぜか
左クリックしか有効になりません。
右クリックやミドルクリックだと動作しないのですがなぜでしょうか?


引用返信 編集キー/
■89327 / inTopicNo.4)  Re[2]: ホイールクリックした時にアクションする方法
□投稿者/ 魔界の仮面弁士 (1945回)-(2018/11/20(Tue) 14:20:20)
No89322 (tora さん) に返信
> テキストボックスだけはなぜか
> 左クリックしか有効になりません。
> 右クリックやミドルクリックだと動作しないのですがなぜでしょうか?

理由については下記参照。C# のコードですが、イメージはつかめるかと。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/TextBoxBase.cs,1690


ざっくり言えば、TextBox は、Left ボタンが離された時にしか
MouseClick イベントを発生させない仕様である、ということです。

MouseDown / MouseUp で代用することも検討してみてください。
引用返信 編集キー/
■89332 / inTopicNo.5)  Re[2]: ホイールクリックした時にアクションする方法
□投稿者/ tora (3回)-(2018/11/20(Tue) 15:02:03)
ありがとうございます。

あと、TablelayoutpanelやGroupboxを押した時
二度押ししたみたいに二回実行されてしまうのですが、
これを避けるにはどうしたら良いですか?


    Private MouseBool As Boolean = False

    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

        If MouseBool = True Then Exit Sub

        MouseBool = True

        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                MsgBox("左ボタンがクリックされました。")

            Case Windows.Forms.MouseButtons.Right
                MsgBox("右ボタンがクリックされました。")

            Case Windows.Forms.MouseButtons.Middle
                MsgBox("マウスホイールがクリックされました。")

            Case Windows.Forms.MouseButtons.XButton1
                MsgBox("X1ボタンがクリックされました。")

            Case Windows.Forms.MouseButtons.XButton2
                MsgBox("X2ボタンがクリックされました。")

        End Select

        MouseBool = False


    End Sub



とやってみても、うまくいかないのですが
時間的にもほぼ同時に入力されているのでしょうか・・・。

引用返信 編集キー/
■89336 / inTopicNo.6)  Re[3]: ホイールクリックした時にアクションする方法
□投稿者/ 魔界の仮面弁士 (1946回)-(2018/11/20(Tue) 15:35:44)
No89332 (tora さん) に返信
> これを避けるにはどうしたら良いですか?

どのコントロールをクリックしたのかを意識せずに、
どこでホイールをクリックしても反応させたいのであれば、
DirectInput で捕らえた方が手っ取り早いかもしれません。


> あと、TablelayoutpanelやGroupboxを押した時
> 二度押ししたみたいに二回実行されてしまうのですが、

当方環境では再現しませんでした。

Handles 句付きのイベントハンドラに対して、追加で AddHandler を呼び出したり、
同じコントロールのイベントに対して、AddHandler を複数回呼び出しては
していないでしょうか?


Public Class Form1
  Private WithEvents tlp As TableLayoutPanel

  Public Sub New()
    InitializeComponent()
    Controls.Clear()

    tlp = New TableLayoutPanel()
    tlp.Name = "tlp"
    tlp.BackColor = Color.Cyan
    tlp.CellBorderStyle = TableLayoutPanelCellBorderStyle.OutsetPartial
    tlp.RowCount = 2
    tlp.ColumnCount = 2
    tlp.RowStyles.Add(New RowStyle(SizeType.Percent, 50))
    tlp.RowStyles.Add(New RowStyle(SizeType.Percent, 50))
    tlp.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50))
    tlp.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 50))
    tlp.Parent = Me
  End Sub

  Private Sub tlp_MouseClick(sender As Object, e As MouseEventArgs) Handles tlp.MouseClick
    Debug.WriteLine("tlp " & e.Button.ToString())
  End Sub

  Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
    Debug.WriteLine("Form1 " & e.Button.ToString())
    MyBase.OnMouseClick(e)
  End Sub
End Class
引用返信 編集キー/
■89337 / inTopicNo.7)  Re[4]: ホイールクリックした時にアクションする方法
□投稿者/ tora (4回)-(2018/11/20(Tue) 15:47:33)
ありがとうございます。
仰る通り、AddHandlerを二重に呼び出している可能性が高いです。

あるコントロールに対して、既にAddHandlerが呼び出してあるか
調べるようなことはできますか?

引用返信 編集キー/
■89338 / inTopicNo.8)  Re[5]: ホイールクリックした時にアクションする方法
□投稿者/ tora (5回)-(2018/11/20(Tue) 15:50:39)
プログラムのバグに気付きました
どうもありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ