''''== 控件与消息函数 =============================
''''CallWindowProc 把消息信息传递给指定的窗体过程
''''GetClassName 为指定的窗口取得类名
''''SetWindowLong 在窗体结构中为指定的窗体设置信息。返回值:Long,指定数据的前一个值。
''''WindowFromPoint 返回包含了指定点的窗口的句柄。
Public 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
Public Declare Function GetClassNameA Lib "user32" (ByVal hWnd As Long, lpClassName As Any, ByVal nMaxCount As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
''''-- SetWindowLong ------------------------------
Public Const GWL_WNDPROC = -4
''''===============================================
Public Const WM_ENTERIDLE = &H121
''''===============================================
Public MeOldWndProc As Long ''''旧的窗体消息处理程序地址
Public ShowMsg As Boolean
Public OldIn As Boolean
Public OldTime As Long
Public ChkTime As Boolean
Public Function ClassName(ByVal hWnd As Long) As String
Dim StrData(0 To &H100) As Byte
Dim Rc As Long
Rc = GetClassNameA(hWnd, StrData(0), &H100)
If Rc > 0 Then
ClassName = StrConv(LeftB(StrData, Rc), vbUnicode)
Else
ClassName = vbNullString
End If
End Function
Public Sub Hook(ByVal hWnd As Long)
MeOldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHook(ByVal hWnd As Long)
Call SetWindowLong(hWnd, GWL_WNDPROC, MeOldWndProc)
End Sub
''''消息处理
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case uMsg
Case WM_ENTERIDLE
''''Debug.Print "WM_ENTERIDLE"
ChkExit
Case Else
''''If ShowMsg Then Debug.Print uMsg
''''下级传递消息
WindowProc = CallWindowProc(MeOldWndProc, hWnd, uMsg, wParam, lParam)
End Select
End Function
Public Sub ChkExit()
Dim TempPoint As POINTAPI
Dim TemphWnd As Long
Dim TempBool As Boolean
GetCursorPos TempPoint
TemphWnd = WindowFromPoint(TempPoint.X, TempPoint.Y)
If TemphWnd Then
TempBool = (ClassName(TemphWnd) = "#32768")
Else
TempBool = False
End If
''''Debug.Print TempBool
If TempBool <> OldIn Then
If TempBool Then
OldTime = 0
ChkTime = False
Else
OldTime = GetTickCount
ChkTime = True
End If
OldIn = TempBool
End If
If ChkTime Then
If GetTickCount - OldTime > 1000 Then ''''大于1秒就退出
''''Debug.Print "Exit"
keybd_event VK_ESCAPE, 0, 0, 0
keybd_event VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0
ChkTime = False
End If
End If
End Sub
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




