Top > プログラミング > .NET Tips> TextBoxで右クリックしてもコンテキストメニューが表示されないようにする

TextBoxで右クリックしてもコンテキストメニューが表示されないようにする」への評価、コメント

評価

良い / 悪い = 24 / 4 (「良い」の割合 = 0.857 , 人気度 = 1.240

評価する

コメント一覧


通常のコメント
管理人 2014/10/4 (Sat) 01:37:32
CAT-chyさんから教えていただいた問題と解決法を独立した別の記事として紹介させていただくことにしました。r-y-oさんと大平さんのコメントも参考にさせていただきました。ありがとうございました。

http://dobon.net/vb/dotnet/control/tbpreventdefaultmenu.html

通常のコメント
大平 2011/08/1 (Mon) 04:35:27
本編、[ CAT-chy ]さん、[ r-y-o ]さんの情報をもとに、
コンテキストメニューを表示しないテキストボックスをクラス化しました。
(デザイナーに生成されたファイルと、名前空間は省略します。)


using System.Windows.Forms;

public partial class コンテキストメニュー無しTextBox : TextBox
{
public コンテキストメニュー無しTextBox()
{
InitializeComponent();
ContextMenu = new ContextMenu();
}

protected override void OnMouseMove( MouseEventArgs e )
{
if ( ( e.Button & MouseButtons.Right ) == MouseButtons.Right )
{
if ( !ClientRectangle.Contains( e.Location ) )
{
Capture = false;
}
}

base.OnMouseMove( e );
}
}

評価の理由
まけろう 2010/12/7 (Tue) 16:22:34
評価:良い
大変助かります。

通常のコメント
r-y-o 2008/05/18 (Sun) 15:26:10
CAT-chyさんの方法を参考にWinProcを使用しない方法を考えてみました。

protected override void OnMouseMove(MouseEventArgs e) {
if (e.Button == MouseButtons.Right) {
if (e.X < 0 || e.Y < 0 || ClientSize.Width >= e.X || ClientSize.Height >= e.Y) {
Capture = false;
}
}

base.OnMouseMove(e);
}

通常のコメント
CAT-chy 2006/10/5 (Thu) 13:42:22
微妙にバグを含んでしましたので、訂正。
if (m.Msg == WM_MOUSEMOVE && (m.WParam.ToInt32() & MK_RBUTTON) != 0) {
 short x = (short)(m.LParam.ToInt64() & 0xffff);
 short y = (short)((m.LParam.ToInt64() >> 16) & 0xffff);
 if (x < 0 || y < 0 || this.ClientSize.Width <= x || this.ClientSize.Height <= y) ReleaseCapture();
}

通常のコメント
CAT-chy 2006/10/2 (Mon) 20:21:47
領域外での右ボタンupでのデフォルトのコンテキストメニュー表示を以下の方法で防いでみました。
[System.Runtime.InteropServices.DllImport("USER32.DLL", EntryPoint="ReleaseCapture")]
public static extern void ReleaseCapture();

private const int WM_MOUSEMOVE = 0x0200;
private const int MK_RBUTTON = 0x0002;

protected override void WndProc(ref Message m) {
if (m.Msg == WM_MOUSEMOVE && m.WParam.ToInt32() == MK_RBUTTON) {
short x = (short)(m.LParam.ToInt64() & 0xffff);
short y = (short)((m.LParam.ToInt64() >> 16) & 0xffff);
if (x < 0 || y < 0 || (this.Width-4) <= x || (this.Height-4) <= y) ReleaseCapture();
}

base.WndProc(ref m);
}

評価の理由
hiori 2006/06/22 (Thu) 16:11:18
評価:良い
探していた情報があって助かりました。

評価の理由
Akubi0831 2004/08/17 (Tue) 20:19:52
評価:良い
APIを使用しないといけないか悩んでいました。
メッセージ送信とか使用せずに、簡単に解決できるのを知りました。

評価の理由
ジョッキー 2004/07/2 (Fri) 11:34:04
評価:良い
考えてみれば、何てことも無いですが、・・・・
簡単なことだけど、悩むところです。
ありがとうございました。

通常のコメント
2004/05/26 (Wed) 20:30:28
右クリックアップをTextBox外で行うとデフォのメニューが出てしまいます。
MouseUpで
if(e.Button == MouseButtons.Right)
textBox1.Undo();
MouseDownで
if(e.Button == MouseButtons.Right)
textBox1.ClearUndo();
これで強引ですが、貼り付け無効には出来ます。

コメントの投稿

[説明]