对一个VB程序员来讲,当程序要与用户进行交互时(如要求输入用户名或某些特定的数据)InputBox肯定会成为首选的方法.确实,InputBox的方便之处是其它语言无法相比的:在SDK的方式下,我们必须自己写一个窗口,然后申请内存,用完后还要手动释放内存.
世上没有十全十美的人,也没有十全十美的事,InputBox不适合用于输入密码令人甚感遗憾.为了解决这下问题,我们不得不自己添加一个窗体,添加控件,添加代码,一系列的操作尽管不是很复杂,但却也令人心烦不止--毕竟这只是一个很简单的问题却要如此大动干戈,总有点得不失尝的感觉.
废话了这么多, 该说说原理了:非常的简单,把InputBox上的输入框设置为有密码字符就行了,但是好像这步不太容易,因为InputBox上的输入框不是我们能轻易可以操作的--普通的输入框只要在"属性"里设置就可以了.看来还是得废话废话^_^;
世上有很谜至今都还是谜,InputBox不管怎样变也只是Windows中的一个标准窗口,它也无法逃出Windows的控制.Windows对她的子女的一举一动了如指掌,创建,激活,销毁无一能逃出她的双眼.我们就在这里动手,请来了鼎鼎大名的系统钩子WH_CBT(在一阵热烈的掌声与无数MM的疯狂叫声中,WH_CBT闪亮登场,'谢谢大家!谢谢大家的支持'),WH_CBT何人也?MSDN上有详细的资料.
WH_CBT是个爽快的能干的人,上来不到2分钟就令大家感受到他的魅力四射,众MM的叫声更是令我倍感汗颜.他究竟做了什么,如何做?下面是我们的独家专访,如要转载,请注明出处
除去声明部分,真正做了事的只是第13-24行,换句话说,只是用了12行代码就实现了我们想要的InputBox
鬼龙之舞 15:26 04-10-28
世上没有十全十美的人,也没有十全十美的事,InputBox不适合用于输入密码令人甚感遗憾.为了解决这下问题,我们不得不自己添加一个窗体,添加控件,添加代码,一系列的操作尽管不是很复杂,但却也令人心烦不止--毕竟这只是一个很简单的问题却要如此大动干戈,总有点得不失尝的感觉.
废话了这么多, 该说说原理了:非常的简单,把InputBox上的输入框设置为有密码字符就行了,但是好像这步不太容易,因为InputBox上的输入框不是我们能轻易可以操作的--普通的输入框只要在"属性"里设置就可以了.看来还是得废话废话^_^;
世上有很谜至今都还是谜,InputBox不管怎样变也只是Windows中的一个标准窗口,它也无法逃出Windows的控制.Windows对她的子女的一举一动了如指掌,创建,激活,销毁无一能逃出她的双眼.我们就在这里动手,请来了鼎鼎大名的系统钩子WH_CBT(在一阵热烈的掌声与无数MM的疯狂叫声中,WH_CBT闪亮登场,'谢谢大家!谢谢大家的支持'),WH_CBT何人也?MSDN上有详细的资料.
WH_CBT是个爽快的能干的人,上来不到2分钟就令大家感受到他的魅力四射,众MM的叫声更是令我倍感汗颜.他究竟做了什么,如何做?下面是我们的独家专访,如要转载,请注明出处
- '以下代码保存在模块
- '=========================================
- Option Explicit
- Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
- Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
- Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
- Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
- Private Const EM_SETPASSWORDCHAR = &HCC
- Private Const WH_CBT = 5
- Private Const HCBT_ACTIVATE = 5
- Private hHook As Long
- Private Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- If nCode = HCBT_ACTIVATE Then
- Dim hEdit As Long
- hEdit = FindWindowEx(wParam, 0, "Edit", vbNullString)
- SendMessage hEdit, EM_SETPASSWORDCHAR, Asc("*"), ByVal 0&
- UnhookWindowsHookEx hHook
- End If
- End Function
- Public Function MyInputBox(prompt As String, Optional title As String, Optional default As String) As String
- hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, App.hInstance, App.ThreadID)
- MyInputBox = InputBox(prompt, title, default)
- End Function
- '===========================================
- '调用示例代码,在窗体
- '===========================================
- Private Sub Command1_Click()
- Dim password As String
- password = MyInputBox("请输入密码", "登录")
- If password = "1234567890" Then
- Debug.Print "密码正确"
- Else
- Debug.Print "密码不正确"
- End If
- End Sub
除去声明部分,真正做了事的只是第13-24行,换句话说,只是用了12行代码就实现了我们想要的InputBox
鬼龙之舞 15:26 04-10-28