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

わんくま同盟

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

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

ツリー一括表示

マウスクリックとホイールを無効化する方法 /yapoo (19/11/05(Tue) 17:04) #92887
Re[1]: マウスクリックとホイールを無効化する方法 /魔界の仮面弁士 (19/11/05(Tue) 17:14) #92888
│└ Re[2]: マウスクリックとホイールを無効化する方法 /yapoo (19/11/05(Tue) 17:22) #92889
│  ├ Re[3]: マウスクリックとホイールを無効化する方法 /774RR (19/11/06(Wed) 08:28) #92895
│  └ Re[3]: マウスクリックとホイールを無効化する方法 /魔界の仮面弁士 (19/11/06(Wed) 10:22) #92898
│    └ Re[4]: マウスクリックとホイールを無効化する方法 /yapoo (19/11/06(Wed) 09:58) #92896
Re[1]: マウスクリックとホイールを無効化する方法 /にゃるら (19/11/06(Wed) 15:16) #92901
Re[1]: マウスクリックとホイールを無効化する方法 /KOZ (19/11/07(Thu) 10:44) #92908
  └ Re[2]: マウスクリックとホイールを無効化する方法 /yapoo (19/11/07(Thu) 14:22) #92912 解決済み


親記事 / ▼[ 92888 ] ▼[ 92901 ] ▼[ 92908 ]
■92887 / 親階層)  マウスクリックとホイールを無効化する方法
□投稿者/ yapoo (1回)-(2019/11/05(Tue) 17:04:48)

分類:[.NET 全般] 

Cursor = Cursors.WaitCursor

とすることで、マウスカーソルを待機状態に変更することができます。
この状態の時に、
マウスでコントロールをクリックやホイールを回しても
コントロールの内容を変更できなくしたいのですが、
どのようにすれば良いですか?

一つ一つコントロール毎に、
マウスクリックイベントとホイールイベントを書いていくのは
非常に面倒なので
一括で書きたいのですが
どのようにすれば良いでしょうか?

[ □ Tree ] 返信 編集キー/

▲[ 92887 ] / ▼[ 92889 ]
■92888 / 1階層)  Re[1]: マウスクリックとホイールを無効化する方法
□投稿者/ 魔界の仮面弁士 (2458回)-(2019/11/05(Tue) 17:14:01)
No92887 (yapoo さん) に返信
> Cursor = Cursors.WaitCursor

という事は、WPF や ASP.NET WebForms ではなく、WinForms での開発ですね。
行末セミコロンも無いので VB かな。


> マウスでコントロールをクリックやホイールを回しても
> コントロールの内容を変更できなくしたいのですが、
> どのようにすれば良いですか?

マウス、タッチ、スタイラス、キーボード等々、
すべての入力をブロックしてもよいのなら、
親フォームまるごと使用不可にしてしまうとか。

Me.Enabled = False
[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92888 ] / ▼[ 92895 ] ▼[ 92898 ]
■92889 / 2階層)  Re[2]: マウスクリックとホイールを無効化する方法
□投稿者/ yapoo (2回)-(2019/11/05(Tue) 17:22:02)
ありがとうございます。

確かにこの方法でもできるのですが、
ウインドウフォームの外観を変えずに
マウス(とキーボード)の操作を無効化したいのですが
このようなことは可能でしょうか?

[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92889 ] / 返信無し
■92895 / 3階層)  Re[3]: マウスクリックとホイールを無効化する方法
□投稿者/ 774RR (745回)-(2019/11/06(Wed) 08:28:14)
> ウインドウフォームの外観を変えずにマウス(とキーボード)の操作を無効化
すると通常のユーザーは大いに戸惑うと思うのだけど。

あれ?このアプリ死んでる!しょうがない、タスクマネージャで抹消するか。はお望みの動作?

[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92889 ] / 返信無し
■92898 / 3階層)  Re[3]: マウスクリックとホイールを無効化する方法
□投稿者/ 魔界の仮面弁士 (2461回)-(2019/11/06(Wed) 10:22:33)
No92889 (yapoo さん) に返信
> ウインドウフォームの外観を変えずに
> マウス(とキーボード)の操作を無効化したいのですが
> このようなことは可能でしょうか?

手抜きですが、それっぽい画像に差し替えてしまうのはどうでしょう?


フォームの階層構成を
 Form1
 ├Panel1
 │├他のコントロール
 │└他のコントロール
 └PictureBox1
ようにしておいて…。


普段の状態:
 ・Panel1 は「最背面」「Visible = True」「Dock = Fill」
・PictureBox1 は「再前面」「Visible = False」「Dock = Fill」
ロックする場合:
 ・Graphics.CopyFromScreen で撮影したフォーム画像を PictureBox1.Image に割り当て
 ・Cursors.WaitCursor を適用
 ・コンテナの Visible を反転させ、Panel1.Visible = False、PictureBox1.Visible = True に。
とする感じで。


それでも、考えるべき点はいろいろありますが…。

複数のフォームがあったらその都度処理しなければいけないとか、
無効化中の画面更新(時計やGIFアニメ等)に対応できないとか、
AutoScroll なフォームをどうするかとか、
半透明ウィンドウの場合はどうするのかとか、
無効化中の親フォームの移動や終了を許可するか否かとか。
[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92895 ] / 返信無し
■92896 / 4階層)  Re[4]: マウスクリックとホイールを無効化する方法
□投稿者/ yapoo (3回)-(2019/11/06(Wed) 09:58:27)
No92895 (774RR さん) に返信
>>ウインドウフォームの外観を変えずにマウス(とキーボード)の操作を無効化
> すると通常のユーザーは大いに戸惑うと思うのだけど。
>
> あれ?このアプリ死んでる!しょうがない、タスクマネージャで抹消するか。はお望みの動作?
>

カーソルを待機状態に変えてあるのでそこは問題ありません。
Cursor = Cursors.WaitCursor

[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92887 ] / 返信無し
■92901 / 1階層)  Re[1]: マウスクリックとホイールを無効化する方法
□投稿者/ にゃるら (5回)-(2019/11/06(Wed) 15:16:49)
No92887 (yapoo さん) に返信
> Cursor = Cursors.WaitCursor
>
> とすることで、マウスカーソルを待機状態に変更することができます。
> この状態の時に、
> マウスでコントロールをクリックやホイールを回しても
> コントロールの内容を変更できなくしたいのですが、
> どのようにすれば良いですか?
>
> 一つ一つコントロール毎に、
> マウスクリックイベントとホイールイベントを書いていくのは
> 非常に面倒なので
> 一括で書きたいのですが
> どのようにすれば良いでしょうか?
>

SetWindowsHookExでWH_MOUSEを指定するとか?(キーボード以外は試してないのでうまくいくかはわかりませんが)
[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92887 ] / ▼[ 92912 ]
■92908 / 1階層)  Re[1]: マウスクリックとホイールを無効化する方法
□投稿者/ KOZ (28回)-(2019/11/07(Thu) 10:44:14)
2019/11/07(Thu) 10:45:05 編集(投稿者)
2019/11/07(Thu) 10:44:39 編集(投稿者)

■No92887 (yapoo さん) に返信
> 一つ一つコントロール毎に、
> マウスクリックイベントとホイールイベントを書いていくのは
> 非常に面倒なので
> 一括で書きたいのですが
> どのようにすれば良いでしょうか?

メッセージフィルタを登録してマウスに関するメッセージを無視することができます。


Private Class MouseMessageFilter
    Implements IMessageFilter

    Const WM_MOUSEFIRST As Integer = &H200
    Const WM_MOUSELAST As Integer = &H20E

    Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean _
            Implements IMessageFilter.PreFilterMessage
        Select Case m.Msg
            Case WM_MOUSEFIRST To WM_MOUSELAST
                Return True
            Case Else
                Return False
        End Select
    End Function
End Class

Dim mouseFilter As New MouseMessageFilter()

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Application.AddMessageFilter(mouseFilter)
    Me.Cursor = Cursors.WaitCursor
End Sub

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Application.RemoveMessageFilter(mouseFilter)
    Me.Cursor = Cursors.Default
End Sub

[ 親 92887 / □ Tree ] 返信 編集キー/

▲[ 92908 ] / 返信無し
■92912 / 2階層)  Re[2]: マウスクリックとホイールを無効化する方法
□投稿者/ yapoo (4回)-(2019/11/07(Thu) 14:22:37)
これでした
素晴らしいです
うまくいきました
どうもありがとうございました。

解決済み
[ 親 92887 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -