- PR -

[Windows VB.NET] コンテキストメニューの非表示で

投稿者投稿内容
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-18 20:31
引用:

ぽぴ王子さんの書き込み (2007-07-18 19:40) より:
NumericUpDown.Controls の中にありませんでしたっけ。



!!!

知らなかった!
っていうか、ContainerControlから派生してるのは知っていたのに
なぜ調べなかったんだろう

前の方法でContextMenuを無効にするには
自分で継承したTextBoxを使えないといけないから無理ですが、
これであんなことやこんなことができます。

自分で作ったMyUpDownBaseはゴミ箱行きかな…

[ メッセージ編集済み 編集者: れい 編集日時 2007-07-18 21:04 ]
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-07-18 22:20
れいさん、ぽぴ王子さん ありがとうございます

目から鱗です


引用:

れいさんの書き込み (2007-07-18 20:31) より:
引用:

ぽぴ王子さんの書き込み (2007-07-18 19:40) より:
NumericUpDown.Controls の中にありませんでしたっけ。



前の方法でContextMenuを無効にするには
自分で継承したTextBoxを使えないといけないから無理ですが、
これであんなことやこんなことができます。

自分で作ったMyUpDownBaseはゴミ箱行きかな…

[ メッセージ編集済み 編集者: れい 編集日時 2007-07-18 21:04 ]



でも 
「NumericUpDown.Controls の中にある」textbox を触る技術を
まるで思い当たらないという 情けない状態です
ひょっとして
CheckBox の checkマークのみ グレーアウトして
text部分だけ 色を変えるなんてことも
同じ方法で出来てしまったりするのでしょうか・・・
わくわくしてきました
Controls内の コントロールを触る方法を
修行してきます 

ありがとうございました

大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-07-18 22:52
れいさん、ぽぴ王子さん すみません

 UpDownButtons、UpDownEdit の2つのコントロールが
 あったのですが・・・
 UpDownEdit の中に TextBox が入ってるのかしら??
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-18 23:23
引用:

七さんの書き込み (2007-07-18 22:52) より:
 UpDownButtons、UpDownEdit の2つのコントロールが
 あったのですが・・・
 UpDownEdit の中に TextBox が入ってるのかしら??



UpDownEditはTextBoxを継承したコントロールですね。
UpDownEditはinternalか何かなので
TextBoxとしてアクセスすればいいのでは?
大ベテラン
会議室デビュー日: 2003/09/16
投稿数: 193
お住まい・勤務地: 千葉県
投稿日時: 2007-07-19 13:09
引用:

れいさんの書き込み (2007-07-18 23:23) より:
UpDownEditはTextBoxを継承したコントロールですね。
UpDownEditはinternalか何かなので
TextBoxとしてアクセスすればいいのでは?




ありがとうございます
やってみます
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-20 04:05
参考までに。
メッセージフックを使った
コンテキストメニューが表示されない
NumericUpDownを貼っておきます。

昔のコードはあまりに汚くて見せられなかったので、
ちょっときれいにして、
Controlsプロパティを使ってHWNDとるようにしました。

たぶん動くとは思うんですが、
右クリックを前面禁止はなんかやな感じなのと
昔作ったんで覚えてない部分があるのが不安なので
使う人がいるなら確認してから使ってください。

コード:

Public Class NoContextNumericUpDown
Inherits NumericUpDown

Private Const WH_GETMESSAGE As Integer = 3
Private Const WM_CONTEXTMENU As UShort = &H7B
Private Const WM_RBUTTONDOWN As UShort = &H204
Private Const WM_RBUTTONUP As UShort = &H205
Private Const WM_RBUTTONDBLCLK As UShort = &H206

Private hhook As IntPtr
Private fook As HookProc
Private Delegate Function HookProc(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer

<System.Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
Private Class MSG
Public hwnd As IntPtr
Public message As UShort
Public wParam As IntPtr
Public lParam As IntPtr
Public time As UInt32
Public point_x As Integer
Public point_y As Integer
End Class

Public Sub New()
If Not DesignMode Then
fook = New HookProc(AddressOf CallGetMsgProc)
Me.hhook = NoContextNumericUpDown.SetWindowsHookEx(WH_GETMESSAGE, fook, IntPtr.Zero, GetCurrentThreadId)
If Me.hhook = 0 Then Throw New Exception(System.Runtime.InteropServices.Marshal.GetLastWin32Error().ToString("x"))
End If
MyBase.ContextMenu = Nothing
MyBase.ContextMenuStrip = Nothing
End Sub

Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If Me.hhook <> IntPtr.Zero Then
NoContextNumericUpDown.UnhookWindowsHookEx(Me.hhook)
hhook = IntPtr.Zero
End If
MyBase.Dispose(disposing)
End Sub

Public Overrides Property ContextMenu() As System.Windows.Forms.ContextMenu
Get
Return Nothing
End Get
Set(ByVal value As System.Windows.Forms.ContextMenu)
End Set
End Property

Public Overrides Property ContextMenuStrip() As System.Windows.Forms.ContextMenuStrip
Get
Return Nothing
End Get
Set(ByVal value As System.Windows.Forms.ContextMenuStrip)
End Set
End Property

Protected Overrides Sub DefWndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_CONTEXTMENU Then m.Msg = 0
MyBase.DefWndProc(m)
End Sub

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function SetWindowsHookEx(ByVal idhook As Integer, ByVal lpfn As HookProc, ByVal hmod As IntPtr, ByVal dwthreadid As Integer) As IntPtr
End Function

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function UnhookWindowsHookEx(ByVal hhook As IntPtr) As Integer
End Function

<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private Shared Function CallNextHookEx(ByVal hhook As IntPtr, ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function

<System.Runtime.InteropServices.DllImport("kernel32.dll")> _
Public Shared Function GetCurrentThreadId() As UInt32
End Function

Public Function CallGetMsgProc(ByVal code As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
If code < 0 Then Return CallNextHookEx(hhook, code, wParam, lParam)

Dim msg As New MSG
System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, msg)

If msg.hwnd <> Me.Handle AndAlso msg.hwnd <> Me.Controls(0).Handle AndAlso msg.hwnd <> Me.Controls(1).Handle Then Return CallNextHookEx(hhook, code, wParam, lParam)

If msg.message = WM_CONTEXTMENU OrElse (msg.message >= WM_RBUTTONDOWN AndAlso msg.message <= WM_RBUTTONDBLCLK) Then
System.Runtime.InteropServices.Marshal.Copy(New Byte() {0, 0}, 0, New IntPtr(lParam.ToInt32 + 4), 2)
End If

Return CallNextHookEx(hhook, code, wParam, lParam)
End Function

End Class



[ メッセージ編集済み 編集者: れい 編集日時 2007-07-20 04:13 ]

スキルアップ/キャリアアップ(JOB@IT)