博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

支持密码输入的InputBox

Posted on 2008-05-21 13:18  chris  阅读(2002)  评论(4)    收藏  举报
对一个VB程序员来讲,当程序要与用户进行交互时(如要求输入用户名或某些特定的数据)InputBox肯定会成为首选的方法.确实,InputBox的方便之处是其它语言无法相比的:在SDK的方式下,我们必须自己写一个窗口,然后申请内存,用完后还要手动释放内存.
    世上没有十全十美的人,也没有十全十美的事,InputBox不适合用于输入密码令人甚感遗憾.为了解决这下问题,我们不得不自己添加一个窗体,添加控件,添加代码,一系列的操作尽管不是很复杂,但却也令人心烦不止--毕竟这只是一个很简单的问题却要如此大动干戈,总有点得不失尝的感觉.
   
    废话了这么多, 该说说原理了:非常的简单,把InputBox上的输入框设置为有密码字符就行了,但是好像这步不太容易,因为InputBox上的输入框不是我们能轻易可以操作的--普通的输入框只要在"属性"里设置就可以了.看来还是得废话废话^_^;

    世上有很谜至今都还是谜,InputBox不管怎样变也只是Windows中的一个标准窗口,它也无法逃出Windows的控制.Windows对她的子女的一举一动了如指掌,创建,激活,销毁无一能逃出她的双眼.我们就在这里动手,请来了鼎鼎大名的系统钩子WH_CBT(在一阵热烈的掌声与无数MM的疯狂叫声中,WH_CBT闪亮登场,'谢谢大家!谢谢大家的支持'),WH_CBT何人也?MSDN上有详细的资料.

   WH_CBT是个爽快的能干的人,上来不到2分钟就令大家感受到他的魅力四射,众MM的叫声更是令我倍感汗颜.他究竟做了什么,如何做?下面是我们的独家专访,如要转载,请注明出处

  1. '以下代码保存在模块
  2. '=========================================
  3. Option Explicit
  4. 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
  5. 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
  6. Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  7. 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
  8. Private Const EM_SETPASSWORDCHAR = &HCC
  9. Private Const WH_CBT = 5
  10. Private Const HCBT_ACTIVATE = 5
  11. Private hHook As Long

  12. Private Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  13.     If nCode = HCBT_ACTIVATE Then
  14.         Dim hEdit As Long
  15.         hEdit = FindWindowEx(wParam, 0, "Edit", vbNullString)
  16.         SendMessage hEdit, EM_SETPASSWORDCHAR, Asc("*"), ByVal 0&
  17.         UnhookWindowsHookEx hHook
  18.     End If
  19. End Function
  20. Public Function MyInputBox(prompt As String, Optional title As String, Optional default As String) As String
  21.     hHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, App.hInstance, App.ThreadID)
  22.     MyInputBox = InputBox(prompt, title, default)
  23. End Function
  24. '===========================================
  25. '调用示例代码,在窗体
  26. '===========================================
  27. Private Sub Command1_Click()
  28.     Dim password As String
  29.     password = MyInputBox("请输入密码", "登录")
  30.     If password = "1234567890" Then
  31.        Debug.Print "密码正确"
  32.     Else
  33.        Debug.Print "密码不正确"
  34.     End If
  35. End Sub

    除去声明部分,真正做了事的只是第13-24行,换句话说,只是用了12行代码就实现了我们想要的InputBox
    鬼龙之舞  15:26 04-10-28