|
<p><font face="Verdana">'窗体中的代码</font></p>
<p><font face="Verdana">Option Explicit</font></p>
<p><font face="Verdana">Private Sub Form_Load()<br/> Shell_Hook_Msg_ID = RegisterWindowMessage("SHELLHOOK")<br/> RegisterShellHookWindow (Me.hWnd) '' 调用未公开的函数进行注册<br/> LogWinOldProc = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WndProc)<br/>End Sub</font></p>
<p><font face="Verdana">Private Sub Form_Unload(Cancel As Integer)<br/> DeregisterShellHookWindow Me.hWnd<br/> SetWindowLong Me.hWnd, GWL_WNDPROC, LogWinOldProc<br/>End Sub</font></p>
<p>'模块中的代码</p>
<p><font face="Verdana">Option Explicit</font></p>
<p><font face="Verdana">Public Declare Function RegisterShellHookWindow Lib "user32" (ByVal hWnd As Long) As Long ''use in NT5<br/>Public Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long<br/>Public Declare Function DeregisterShellHookWindow Lib "user32" (ByVal hWnd As Long) As Long<br/>Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long<br/>Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long<br/>Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long<br/>Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthW" (ByVal hWnd As Long) As Long</font></p>
<p><font face="Verdana">Private Const HSHELL_WINDOWCREATED = 1 '' 顶级窗体被创建<br/>Private Const HSHELL_WINDOWDESTROYED = 2 '' 顶级窗体即将被关闭<br/>Private Const HSHELL_ACTIVATESHELLWINDOW = 3 '' SHELL 的主窗体将被激活<br/>Private Const HSHELL_WINDOWACTIVATED = 4 '' 顶级窗体被激活<br/>Private Const HSHELL_GETMINRECT = 5 '' 顶级窗体被最大化或最小化(本例未用)<br/>Private Const HSHELL_REDRAW = 6 '' Windows 任务栏被刷新<br/>Private Const HSHELL_TASKMAN = 7 '' 任务列表的内容被选中<br/>Private Const HSHELL_LANGUAGE = 8 '' 中英文切换或输入法切换<br/>Private Const HSHELL_SYSMENU = 9 ''显示系统菜单<br/>Private Const HSHELL_ENDTASK = 10 ''顶级窗体被强制关闭<br/>Private Const HSHELL_ACCESSIBILITYSTATE = 11<br/>Private Const HSHELL_APPCOMMAND = 12 ''没有被程序处理的APPCOMMAND。见WM_APPCOMMAND<br/>Private Const HSHELL_WINDOWREPLACED = 13 ''wParam=被替换的顶级窗口的hWnd<br/>Private Const HSHELL_WINDOWREPLACING = 14 ''wParam=替换顶级窗口的窗口hWnd<br/>Private Const HSHELL_HIGHBIT = &H8000& ''掩码<br/>Private Const HSHELL_FLASH = (HSHELL_REDRAW Or HSHELL_HIGHBIT) ''标题闪烁<br/>Private Const HSHELL_RUDEAPPACTIVATED = (HSHELL_WINDOWACTIVATED Or HSHELL_HIGHBIT) ''不知道干吗的</font></p>
<p><font face="Verdana">Public Const GWL_WNDPROC = -4<br/>Private Const MAX_PATH = 260</font></p>
<p><font face="Verdana">Public Shell_Hook_Msg_ID As Long<br/>Public LogWinOldProc As Long</font></p>
<p><font face="Verdana">Public Function WndProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long<br/> Select Case wMsg<br/> Case Shell_Hook_Msg_ID<br/> Dim szTmp As String<br/> Select Case wParam<br/> Case HSHELL_WINDOWACTIVATED<br/> szTmp = String(MAX_PATH, vbNullChar)<br/> Call GetWindowText(lParam, szTmp, MAX_PATH)<br/> Debug.Print "HSHELL_WINDOWACTIVATED:" & Left$(szTmp, GetWindowTextLength(lParam))<br/> Case HSHELL_WINDOWCREATED<br/> szTmp = String(MAX_PATH, vbNullChar)<br/> Call GetWindowText(lParam, szTmp, MAX_PATH)<br/> Debug.Print "HSHELL_WINDOWCREATED:" & Left$(szTmp, GetWindowTextLength(lParam))<br/> '剩下的省略。。<br/> End Select<br/> End Select<br/> WndProc = CallWindowProc(LogWinOldProc, hWnd, wMsg, wParam, lParam)<br/>End Function</font></p> |
|