在一些要求只允许输入数值的场合,就用得上了.
基本思路是,先在文本框的keyPress事件里过滤键盘输入,再使用子类化将粘贴剪切等剪贴板操作吃掉.
窗体frmMain.frm内代码(窗体包含一个文本框Text1):
Option Explicit
'只允许文本框输入数值示例 ' '处理思路: ' 先在文本框的KeyPress事件里处理键盘上的输入,再使用子类化禁止复制粘贴与剪切消息. ' 'BY 嗷嗷叫的老马 ' 紫水晶工作室 ' http://www.m5home.com/ '2009-10-03 Private Sub Form_Load() '复制粘贴剪切使用子类化处理 PrevWndProc = SetWindowLong(Text1.hwnd, GWL_WNDPROC, AddressOf SubWndProc) End Sub Private Sub Form_Unload(Cancel As Integer) SetWindowLong Text1.hwnd, GWL_WNDPROC, PrevWndProc End Sub Private Sub Text1_KeyPress(KeyAscii As Integer) '只允许数字键,退格键,小数点进行输入的处理 Debug.Print KeyAscii Select Case KeyAscii Case vbKey0 To vbKey9, vbKeyBack '0 - 9,BACKSPACE处理 Case vbKeyDelete, vbKeyDecimal '小数点处理 If InStr(1, Text1.Text, ".") <> 0 Then KeyAscii = 0 Case Else KeyAscii = 0 End Select End Sub |
标准模块ModSubClass.bas中的代码:
Option Explicit
'子类化模块
'
'BY 嗷嗷叫的老马
' 紫水晶工作室
' http://www.m5home.com/
'2009-10-03
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Public Const GWL_STYLE As Long = (-16)
Public Const ES_NUMBER As Long = &H2000&
Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_GETTEXT As Long = &HD
Public Const WM_COPY As Long = &H301
Public Const WM_PASTE As Long = &H302
Public Const WM_CUT As Long = &H300
Public PrevWndProc As Long
Public Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case msg '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.
Case WM_COPY, WM_PASTE, WM_CUT '复制,粘贴,剪切处理
SubWndProc = 1 '吃掉不处理.
Exit Function
End Select
SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam) '其它消息不管
End Function
'子类化模块
'
'BY 嗷嗷叫的老马
' 紫水晶工作室
' http://www.m5home.com/
'2009-10-03
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongW" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcW" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) As Long
Public Const GWL_STYLE As Long = (-16)
Public Const ES_NUMBER As Long = &H2000&
Public Const GWL_WNDPROC As Long = (-4)
Public Const WM_GETTEXT As Long = &HD
Public Const WM_COPY As Long = &H301
Public Const WM_PASTE As Long = &H302
Public Const WM_CUT As Long = &H300
Public PrevWndProc As Long
Public Function SubWndProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case msg '在这里进行过滤.如果知道其他的消息,也可以在这里过滤.
Case WM_COPY, WM_PASTE, WM_CUT '复制,粘贴,剪切处理
SubWndProc = 1 '吃掉不处理.
Exit Function
End Select
SubWndProc = CallWindowProc(PrevWndProc, hwnd, msg, wParam, lParam) '其它消息不管
End Function
相关可能感觉兴趣的文章参考:
※VB 获取光标在TextBox、RichTextBox中所在的位置
VB
部分 相关 文 章 推荐※VB禁止使用 Alt-Tab 或 Ctrl-Alt-Del
※VB控件注册 - 利用资源文件将dll、ocx打包进exe文件
※VB:设定 MsgBox 在若干时间之后若无回应则自动关闭
※VB:读取及设定NumLock/CapsLock/ScrollLock的值
※ 在vb中使用Iphlpapi.dll获取网络信息(下) 更多精彩 >>>