|
- '------------下面是模块代码---------------------------------------
- Option Explicit
- Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
- Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
- 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 Const GWL_WNDPROC = (-4)
- Public Const WM_ENDSESSION = &H16
- Public Const WM_QUERYENDSESSION = &H11
- Public preWinProc As Long
- Public Function Wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
- If (Msg = 132) Then
- Select Case Wndproc
- Case 10, 11, 12, 13, 14, 15, 16, 17:
- Wndproc = 0
- Exit Function
- End Select
- End If
- End Function
- '------------下面是窗体代码---------------------------------------
- Option Explicit
- Private Sub Form_Load()
- Dim ret As Long
- '记录原来的Window Procedure的位址
- preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
- '设定form的window Procedure到wndproc
- ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Wndproc)
- End Sub
- Private Sub Form_Unload2(Cancel As Integer)
- Dim ret As Long
- '取消Message的截取,而使之又只送往原来的Window Procedure
- ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
- End Sub
复制代码
|
|