VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 让密码轻松显示
发表评论(0)作者:, 平台:, 阅读:11856, 日期:2000-06-18
让密码轻松显示





   你梦想的密码显示程序是什么样子呢?不需要两个窗口之间的切换,不需要图标拖来拖去,只需要移动鼠标到密码框上,密码就会自动显示出来。真的有那么神奇吗?嗯哼,跟着我做吧。

  首先,新建一个工程,然而建立一个公共模块,把以下代码贴入其中:

  Declare Function SendMessage Lib “user32" Alias “SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

  Declare Function IsWindow Lib “user32" (ByVal hwnd As Long) As Long

  Declare Function GetCursorPos Lib “user32" (lpPoint As POINTAPI) As Long

  Declare Function WindowFromPoint Lib“user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

  Declare Function InvalidateRect Lib “user32" (ByVal hwnd As Long, lpRect As Any, ByVal bErase As Long) As Long

  Type RECT

   Left As Long

   Top As Long

   Right As Long

   Bottom As Long

  End Type

  Type POINTAPI

   x As Long

   y As Long

  End Type

  Public Const WM_PAINT = &HF

  Public Const EM_SETPASSWORDCHAR = &HCC

  Public Const WM_ERASEBKGND = &H14

  你可以使用API文本查看器来助你一臂动,但一定要注意InvalidateRect函数中的lpRect参数类型应为Any,而不是Rect类型,否则……,呵呵,你试试就知道了。

  接下来,在窗体上放置一个timer控件,把它的interval属性设为1000,也就是每秒一次。然后双击它,写入以下代码:

  Private Sub Timer1_Timer()

  Dim hwnd As Long

  Dim WndIs As Long

  Dim temp As Long

  Dim CurrentP As POINTAPI

  temp = GetCursorPos(CurrentP)

  hwnd = WindowFromPoint(CurrentP.x, CurrentP.y)

  WndIs = IsWindow(hwnd)

  If WndIs <> 0 Then

   temp = SendMessage(hwnd, EM_SETPASSWORDCHAR, 0, 0)

   temp = InvalidateRect(0, 0, 1)

   End If

   End Sub

   OK,运行它。可是,这窗体上什么也没有,那么怎样才能显示密码?别急,这个窗体没有用了,你可以最小化它,然后打开密码程序,例如“拨号网络",把鼠标移动到它的“*”上面,然后……,怎样?揉一揉眼睛,没错吧!

  奥秘在哪儿呢?这个程序向你露出庞大的Windows消息系统的冰山一角,显示出一些鲜为人知的Windows系统的秘密。

  众多的VB用户都知道,Windows程序是基于消息驱动的进程。每一个程序都调用了大量的外部模块,很多模块程序代码位于DLL库和ActiveX库中,各种模块通信的过程就是消息响应的过程。文本编辑控件可设置成PassWorChar属性,即成为密码框,它同样需要响应其它消息才能与其它模块进行通讯,比如,它响应——消息,你就可以利用GetWindowText函数取得它的内容(这就是上一个密码程序的原理呀)。同样,它响应EM_SETPASSWORDCHAR消息就可以把它由密码状态还原为初始状态,然后你必须再发送WM_PAINT消息来刷新它,才能完全显示出来。怎样,简单吧。抛砖引玉,你还可以发送其它消息来达到其它的效果。(重庆 唐灿)