vb怎么写一个让主窗口拒绝接受任何消息的程序。如:WM_CLOSE消息

如题所述

第1个回答  2011-09-24
用子类化技术,拦截窗口的消息,判断消息类型,再根据情况是否回调...追问

小弟入门不久,请给个实例代码!谢谢!

追答

比如:

'Module里的代码:
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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

Private Const GWL_WNDPROC = (-4)
Private Const WM_CLOSE = &H10
Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_MOUSEMOVE = &H200
Private Const WM_MOVE = &H3
Private Const WM_PAINT = &HF

Public lhWnd As Long, oldProc As Long
Public b As Boolean

'子类化过程
Public Function SubHook(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
b = True
'处理消息
Select Case Msg
Case WM_LBUTTONUP
Form1.Print "123"
Case Else
End Select
If b Then SubHook = CallWindowProc(oldProc, lhWnd, Msg, wParam, lParam)
End Function

'开始子类化
Public Sub StartSubHook(hWnd As Long)
lhWnd = hWnd: oldProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubHook)
End Sub

'结束子类化
Public Sub EndSubHook()
Call SetWindowLong(lhWnd, GWL_WNDPROC, oldProc)
End Sub

'Form1里的代码:
Private Sub Form_Load()
Call StartSubHook(Me.hWnd)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call EndSubHook
End Sub

第2个回答  2011-09-24
拒绝任何消息的程序根本就不存在
启动,运行,终止。这三样哪个不是消息的支撑。
只能用子类化,做特定消息的拦截。追问

小弟入门不久,请给个实例代码!谢谢!

本回答被提问者采纳
第3个回答  2011-09-24
定义常量
Const HWND_BRODCAST = &HFFFF&
Const WM_SETTINGCHANGE = &H1A&

定义API
Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)

发送消息
SendMessage HWND_BRODCAST , WM_SETTINGCHANGE , 0& , 0&