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

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

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

NumericUpDownの音を変えるには?

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

■93625 / inTopicNo.1)  NumericUpDownの音を変えるには?
  
□投稿者/ tyou (1回)-(2019/12/28(Sat) 13:26:01)

分類:[.NET 全般] 

VB.NETでNumericUpDownを使っているのですが、
MaximumやMinimumを超える値を入力しようとすると
ビープ音が鳴ります。

このビープ音を別で用意したwavファイルを再生したいのですが
どのようにすれば良いですか?

どこかのSubをOverridesすれば良いですか?


引用返信 編集キー/
■93626 / inTopicNo.2)  Re[1]: NumericUpDownの音を変えるには?
□投稿者/ PANG2 (328回)-(2019/12/28(Sat) 14:29:07)
2019/12/28(Sat) 14:30:04 編集(投稿者)

削除
引用返信 編集キー/
■93632 / inTopicNo.3)  Re[2]: NumericUpDownの音を変えるには?
□投稿者/ tyou (2回)-(2019/12/31(Tue) 15:58:57)
どなたかご回答いただけないでしょうか?
そういった方法が存在しないということでしょうか?

引用返信 編集キー/
■93633 / inTopicNo.4)  Re[1]: NumericUpDownの音を変えるには?
□投稿者/ Azulean (1120回)-(2019/12/31(Tue) 16:37:35)
No93625 (tyou さん) に返信
> VB.NETでNumericUpDownを使っているのですが、
> MaximumやMinimumを超える値を入力しようとすると
> ビープ音が鳴ります。

「MaximumやMinimumを超える値を入力しようとする」ではなく、Enter キーを押したら常に鳴りませんかね…?
Windows 10&.NET 4.8 でいろいろと試しましたが、「値を問わず、Enter キーを押したらビープ音が鳴る」以外、「音が鳴ることなく、静かに値が補正される」だけに見えました。

なお、この Enter キーを押すと鳴るビープ音は、改行できないテキストボックス類で Enter キーを押下したときに鳴らされているのでその振る舞いを変えるのは面倒かもしれません。
引用返信 編集キー/
■93634 / inTopicNo.5)  Re[2]: NumericUpDownの音を変えるには?
□投稿者/ tyou (3回)-(2019/12/31(Tue) 17:20:39)
すいません、勘違いしていました、
仰る通り、Enterキーを押した時に音が鳴ります。

面倒でも構いませんので、
音を変える、あるいは無効化する方法があればご提示いただけないでしょうか?

引用返信 編集キー/
■93635 / inTopicNo.6)  Re[3]: NumericUpDownの音を変えるには?
□投稿者/ Azulean (1121回)-(2019/12/31(Tue) 17:48:20)
No93634 (tyou さん) に返信
> 面倒でも構いませんので、
> 音を変える、あるいは無効化する方法があればご提示いただけないでしょうか?

「NumericUpDown」は「UpDownBase」というクラスを継承しています。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/NumericUpDown.cs,13413a491f0986d9

その「UpDownBase」クラスには「UpDownEdit」という名前の「TextBox」クラスを継承したクラスがあります。
https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/UpDownBase.cs,05edf813bc58c0d8

音が鳴る要因のテキストボックスはこれなので、このコントロール(ウィンドウ)に対してメッセージをフックするなど、何か手を打てば良いとは思います。
ただ、試すのも少し手間がかかるので試していません。よって、コードは提供できません。
引用返信 編集キー/
■93636 / inTopicNo.7)  Re[4]: NumericUpDownの音を変えるには?
□投稿者/ tyou (4回)-(2019/12/31(Tue) 18:59:09)
私の知識レベルではどのようにしたら良いか検討も付きません。
コードをご提供いただけると幸いです。

引用返信 編集キー/
■93637 / inTopicNo.8)  Re[5]: NumericUpDownの音を変えるには?
□投稿者/ Azulean (1122回)-(2020/01/01(Wed) 00:16:22)
2020/01/01(Wed) 00:23:11 編集(投稿者)

No93636 (tyou さん) に返信
> 私の知識レベルではどのようにしたら良いか検討も付きません。
> コードをご提供いただけると幸いです。

それは「できる人に、あなたのために特化したコードを書く仕事を頼んでいることと」同義なのですが…。
わからないなら「諦める」ことを提案しておきます。

結局、Web 検索して解決事例が見つからないようなことは「ほとんどの人がやらないこと」なので、そういったニッチな部分は避けた方が無難です。
技術的な難しさだったり、そういったこだわりの効果が薄かったり、理由は様々です。
ニッチなところに取り組みたいのなら、それなりに自分の技(調べる力、応用する力)を磨くべきだと思っています。
(「面倒でも構わない」と言ったのだから、その努力をすべきだと思う…)
-----

頑張るということであれば、もう少し添えておきます。
メッセージフックの路線を考える場合、キーワードとなるのは「NativeWindow.AssignHandle」でしょうか。

1. NumericUpDown 内の内部 TextBox のウィンドウハンドルを探す方法を確立する(FindWindow やその類い)
2. NativeWindow.AssignHandle でメッセージの横取りの仕組みを確立する
3. メッセージを観察しつつ、どのようにすればビープ音を避けられるかを検証、試行錯誤する

ただし、私だったらこう考えるという話であり、実現できるかどうか、実現できたとして副作用がないかは、検証していないのでわかりません。
引用返信 編集キー/
■93638 / inTopicNo.9)  Re[5]: NumericUpDownの音を変えるには?
□投稿者/ KOZ (76回)-(2020/01/01(Wed) 02:48:07)
2020/01/01(Wed) 03:22:56 編集(投稿者)

No93636 (tyou さん) に返信
>> MaximumやMinimumを超える値を入力しようとすると
>> ビープ音が鳴ります。

とあったのでカスタマイズしてるのかと思いました。

Enter キーが押されたときに音を鳴らしているのは、OnTextBoxKeyPress メソッドです。
有効な文字でなければ、MessageBeep API を呼んでいます。

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/NumericUpDown.cs,6efbcd02b6117cf4

ここをオーバーライドすればよいです。

音を鳴らす方法は DOBON さんのところにサンプルがあります。

「WAVEファイルを再生する」
https://dobon.net/vb/dotnet/programing/playwavfile.html

引用返信 編集キー/
■93639 / inTopicNo.10)  Re[6]: NumericUpDownの音を変えるには?
□投稿者/ Azulean (1123回)-(2020/01/01(Wed) 07:15:34)
No93638 (KOZ さん) に返信
> Enter キーが押されたときに音を鳴らしているのは、OnTextBoxKeyPress メソッドです。
> 有効な文字でなければ、MessageBeep API を呼んでいます。

おっと…、override レベルで済みましたか。失礼しました。
確かにググると出てきますね…。
https://dobon.net/vb/dotnet/control/tbsuppressbeep.html

// あえて VB.NET ではなく、C# で書くとこういうイメージ。

public sealed class NumericUpDownNoBeep : NumericUpDown
{
	protected override void OnTextBoxKeyPress(object source, KeyPressEventArgs e)
	{
		if (e.KeyChar == (char)Keys.Enter)
		{
			e.Handled = true;
			return;
		}
		base.OnTextBoxKeyPress(source, e);
	}
}

引用返信 編集キー/
■93640 / inTopicNo.11)  Re[7]: NumericUpDownの音を変えるには?
□投稿者/ tyou (5回)-(2020/01/01(Wed) 11:28:37)
ありがとうございます。

別にビープを鳴らさないNumericUpDownクラスを作ると
全てのNumericUpDownを書き換える必要があり面倒なので、
既存のNumericUpDownをオーバーライドしたいと考えています。

右クリックメニューを表示しない方法は

    Class NoContextMenuWindow

        Inherits NativeWindow
        Public Sub New(ByVal ctrl As Control)
            Me.AssignHandle(ctrl.Handle)
        End Sub

        Protected Overrides Sub WndProc(ByRef m As Message)
            If m.Msg = &H7B Then ' WM_CONTEXTMENU
                m.Result = IntPtr.Zero
                Return
            End If
            MyBase.WndProc(m)
        End Sub

    End Class

のようにしていけたのですが、
OnTextBoxKeyPressは同様の方法ではうまくいかないようです。

どのようにすればオーバーライドすることができますか?

引用返信 編集キー/
■93641 / inTopicNo.12)  Re[8]: NumericUpDownの音を変えるには?
□投稿者/ KOZ (77回)-(2020/01/01(Wed) 12:48:05)
2020/01/01(Wed) 13:08:57 編集(投稿者)

No93640 (tyou さん) に返信
> 別にビープを鳴らさないNumericUpDownクラスを作ると
> 全てのNumericUpDownを書き換える必要があり面倒なので、
> 既存のNumericUpDownをオーバーライドしたいと考えています。

Enter キー押下時の Beep 音だけでよいなら WM_KEYDOWN で Enter キーが入ってきたら MyBase.WndProc は呼ばないようにすればよいです。

「WM_KEYDOWN」
https://docs.microsoft.com/ja-jp/windows/win32/inputdev/wm-keydown

NumericUpDown コントロールの内部の TextBox に対して処理を行う必要があります。

入力不可な文字が入力された時の音を変更したい場合は

WM_CHAR
WM_SYSCHAR
WM_IME_CHAR

を捕まえて Control.cs がやっている処理と同等の処理を実装する必要があります。
こちらは大変なので、NumericUpDown コントロールを継承したコントロールを作ったほうがよいでしょう。

引用返信 編集キー/
■93642 / inTopicNo.13)  Re[9]: NumericUpDownの音を変えるには?
□投稿者/ KOZ (78回)-(2020/01/01(Wed) 13:27:41)
No93641 (KOZ) に返信
> Enter キー押下時の Beep 音だけでよいなら WM_KEYDOWN で Enter キーが入ってきたら MyBase.WndProc は呼ばないようにすればよいです。

と、思ったんですが、ValidateEditText を呼んでます。

https://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/UpDownBase.cs,1f199cdabb1ba3d1

カスタムコントロールを作るのが無難です。
引用返信 編集キー/
■93649 / inTopicNo.14)  Re[8]: NumericUpDownの音を変えるには?
□投稿者/ Azulean (1124回)-(2020/01/02(Thu) 13:06:47)
No93640 (tyou さん) に返信
> 別にビープを鳴らさないNumericUpDownクラスを作ると
> 全てのNumericUpDownを書き換える必要があり面倒なので、
> 既存のNumericUpDownをオーバーライドしたいと考えています。

それは「オーバーライド」ではなく、「メッセージフック」とか「サブクラス化」と呼ばれるものです。
「オーバーライド」(上書き)は「継承したクラス」で使う言葉になります。

書き換えが面倒と言われていますが、フォルダーを指定して置換で、NumericUpDown というキーワードのものを一括置換すれば良いはずです。
ただ、慣れていないと間違いなく壊れるので、きちんとバックアップを取った上で試してください。
そういうことに慣れていくことも、技を増やす・スキルアップにつながることだと思っています。


> 右クリックメニューを表示しない方法は
(略)
> のようにしていけたのですが、

私が言っていた、メッセージフックはすでに実施されているようですが、「わからない」という感じだったので、どこかからもらってきた感じでしょうか。
コードをもらうこと自体は問題ないと思いますが、何をしているコードなのかを学ぶこと・知ることは大事だと思うので、その点はご留意ください。
引用返信 編集キー/
■93654 / inTopicNo.15)  Re[9]: NumericUpDownの音を変えるには?
□投稿者/ tyou (6回)-(2020/01/03(Fri) 21:42:03)

Protected Overrides Sub WndProc(ByRef m As Message)
m.Msg = &H100 Then
Return
End If
MyBase.WndProc(m)
End Sub

でいけるかと思ったのですが
これでも駄目なのですね・・
面倒そうなので、諦めようと思います・・・
どうもありがとうございました。

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

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


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

このトピックに書きこむ