你梦想的密码显示程序是什么样子呢?不需要两个窗口之间的切换,不需要图标拖来拖去,只需要移动鼠标到密码框上,密码就会自动显示出来。真的有那么神奇吗?嗯哼,跟着我做吧。
首先,新建一个工程,然而建立一个公共模块,把以下代码贴入其中:
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消息来刷新它,才能完全显示出来。怎样,简单吧。抛砖引玉,你还可以发送其它消息来达到其它的效果。 |