广播Windows HWND_Broadcast消息

本文关键字:Broadcast 消息 HWND Windows 广播 | 更新日期: 2023-09-27 17:58:15

我正在该应用程序中的应用程序中工作,我将等待应用程序1中的某个事件,当该事件发生时,我将向应用程序2发送消息,应用程序2将执行某些操作。

首次API申报

private const int HWND_BROADCAST = 0xffff;
 [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int RegisterWindowMessage(string lpString);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool SendNotifyMessage(int hWnd, int Msg, int wParam, int lParam);

应用程序1代码

private string msgstr = "MYMESSAGE";              
public int  msg = RegisterWindowMessage(msgstr);
                if (msg == 0)
                {
                    MessageBox.Show(Marshal.GetLastWin32Error().ToString());
                }
                //SendNotifyMessage(HWND_BROADCAST, msg, 4848484, 8484865);
                SendNotifyMessage(HWND_BROADCAST, msg, 0, 0);
                MessageBox.Show(Marshal.GetLastWin32Error().ToString());

应用程序2代码

 static readonly int msg = RegisterWindowMessage("MYMESSAGE");
     protected override void WndProc(ref Message m)
        {
            if (m.Msg == msg)
            {
                MessageBox.Show(m.Msg.ToString() + " = from wndproc");
            }
            base.WndProc(ref m);
         }

有人能指出这个代码的问题吗。我怀疑SendNotifyMessage 有问题

lparam和wparam参数

有人会建议我采取其他方式来实现这种行为吗

广播Windows HWND_Broadcast消息

  1. 不存在有问题的代码。只有一些代码没有达到您期望的效果。如果您想让我们告诉您上面的代码有什么问题,您应该告诉我们您期望它做什么,(好吧,我们可以猜测,)但最重要的是,它做了什么。你有错吗?它只是悄无声息地失灵了吗?这是一个问题的重要组成部分,你知道!

  2. 您正在使用RegisterWindowMessage()和SendNotifyMessage(?

  3. 应用程序2有一个WndProc,您希望在其中接收窗口的消息。它是否已正确注册?你确定它有效吗?它是否接收其他窗口消息?如果你在应用程序2中发送,它会收到"MYMESSAGE"吗?

  4. HWND_BROADCAST仅向顶级窗口发送消息。你确定你的窗口是顶级窗口吗?

  5. 您没有检查对应用程序2中RegisterWindowMessage()的调用是否成功。首先检查一下怎么样?

  6. "MYMESSAGE"不是一个很好的消息名称。不如使用更独特的东西,比如你的名字加姓氏,或者创建一个guid并使用其字符串表示形式作为消息的名称?

HWND_BROADCAST非常危险。。我知道这是极不可能的,但如果另一个应用程序也处理了你的消息呢??

不管怎样,除此之外,你读过吗http://msdn.microsoft.com/en-us/library/ms644953.aspx

调试代码问题的最基本方法(因为它是基于WINAPI的)是使用GetLastError。您应该始终检查方法的返回值,看看它们是否成功,所以确保它返回零(这意味着它有效)。如果不是,并且出现了访问被拒绝等错误,请尝试在禁用UAC或以管理员身份(Vista+)运行。

当消息被UIPI阻止时最后一个错误,检索时使用GetLastError设置为5(访问拒绝)。

下面的代码运行得很好,

服务器端

public partial class Server : Form
    {
        private UInt32 msg;
        public Server()
        {
            InitializeComponent();
        }
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            msg = RegisterWindowMessage("THIS_IS_MY_UNIQUE_MESSAGE");
        }
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool SendNotifyMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
        private void SendMessage(object sender, EventArgs e)
        {
            var retval = SendNotifyMessage(new IntPtr(-1), msg, 0, 0);
        }

    }

客户端

public partial class Client : Form
    {
        public Client()
        {
            InitializeComponent();
        }
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern uint RegisterWindowMessage(string lpString);

        private static UInt32 GetMessage()
        {
            return RegisterWindowMessage("THIS_IS_MY_UNIQUE_MESSAGE");
        }
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == (int)GetMessage())
            {
                MessageBox.Show(@"Hello, from server");
            }
            base.WndProc(ref m);
        }
    }