(1)发送成功,使用vc做的测试工具可以收到
消息注册:WM_ATTACK=RegisterWindowMessage("WM_ATTACK");
发送:PostMessage HWND_BROADCAST, WM_ATTACK,0,0
(2)接受部分
    lpPrevWndProc = SetWindowLong(me.hwnd, GWL_WNDPROC,AddressOf WindowProc)
处理函数:
    Function WindowProc(ByVal hw As Long, _
                        ByVal uMsg As Long, _
                        ByVal wParam As Long, _
                        ByVal lParam As Long) As Long        Select Case uMsg
            Case WM_ATTACK
                Form1.Caption = "FIND"
            Case Else
                WindowProc = CallWindowProc(lpPrevWndProc, hw, _
                                           uMsg, wParam, lParam)
        End Select
    End Function
(3)使用spy++看了下发现所有的VB程序都收不到广播的自定义消息,奇怪
请大侠帮忙!

解决方案 »

  1.   

    PostMessage HWND_BROADCAST, WM_ATTACK,0,0 只能发送给当前活动的窗口,应该使用另一个函数BroadcastSystemMessage。完整示例代码:
    一、广播发送端:
    Option ExplicitPrivate Declare Function BroadcastSystemMessage Lib "user32" (ByVal dw As Long, pdw As Long, ByVal un As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Const BSF_POSTMESSAGE = &H10
    Private Const BSF_APPLICATIONS = &H8
    Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
    Private WM_ATTACK As Long   '因为需要跨进程,为防止消息号冲突,所以由系统分配一个唯一的消息号Private Sub Command1_Click()
        WM_ATTACK = RegisterWindowMessage("WM_ATTACK")
        BroadcastSystemMessage BSF_POSTMESSAGE, BSF_APPLICATIONS, WM_ATTACK, 0&, 0&
    End Sub二、广播接收端:
    模块文件:
    Option ExplicitPublic Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
    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 Const WM_USER = &H400
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = (-4)
    Public Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long
    Public Const MB_OK = &H0&Public lpPrevProc As Long '原来的消息泵
    Public WM_ATTACK As Long  '因为需要跨进程,为防止消息号冲突,所以由系统分配一个唯一的消息号Public Function MyProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case Msg
            Case WM_ATTACK
                MessageBox hwnd, "接收到广播", "提示", MB_OK
        End Select
        MyProc = CallWindowProc(lpPrevProc, hwnd, Msg, wParam, lParam)
    End Function
    窗口文件:
    Option ExplicitPrivate Sub Form_Load()
        WM_ATTACK = RegisterWindowMessage("WM_ATTACK")
        lpPrevProc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf MyProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Call SetWindowLong(Me.hwnd, GWL_WNDPROC, lpPrevProc)
    End Sub
      

  2.   

    多谢,lyserver
    使用你的方法可以实现了
    但是mmsdn里面是这样的
    HWND_BROADCAST :The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.
    消息被寄送到系统的所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口。消息不被寄送到子窗口。请问VB的form是什么类型的