C# 广播Windows HWNDU广播消息

C# 广播Windows HWNDU广播消息,c#,winapi,ipc,C#,Winapi,Ipc,我正在该应用程序中的某个应用程序中工作,我将等待应用程序1中的某个事件,当该事件发生时,我将向应用程序2发送消息,应用程序2将执行某些操作 第一次API声明 private const int HWND_BROADCAST = 0xffff; [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern int RegisterWindowMessage(

我正在该应用程序中的某个应用程序中工作,我将等待应用程序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 参数


有人能给我推荐其他方法来实现这种行为吗
HWND\u广播
非常危险。。我知道这不太可能,但如果另一个应用程序也处理了您的消息呢

不管怎么说,你有没有读过

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

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

  • 不存在有问题的代码。只有代码不符合您的期望。如果你想让我们告诉你上面的代码有什么问题,你应该告诉我们你希望它做什么,(好吧,我们可以猜出来,)但最重要的是,它做了什么。你有错误吗?它只是默默地失败了吗?这是一个问题的重要部分,你知道

  • 您正在使用RegisterWindowMessage()和SendNotifyMessage()等方法,这些方法的定义没有显示给我们。当我们不知道SendNotifyMessage()是如何声明的时,我们应该如何判断问题是否出在SendNotifyMessage()上

  • 您的应用程序2有一个WndProc,您希望在其中接收窗口的消息。是否已正确登记?你确定它有效吗?它是否接收其他窗口消息?如果您从应用程序2中发送“MYMESSAGE”,它会收到吗

  • HWND_广播仅向顶级窗口发送消息。您确定您的窗口是顶级窗口吗

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

  • “MYMESSAGE”不是一个很好的消息名称。使用更独特的东西,比如你的名字加上姓氏,或者创建一个guid并使用它的字符串表示形式作为消息的名称,怎么样


  • 下面的代码工作得很好

    服务器端。

    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);
            }
        }
    

    UIPI和UAC是什么意思?用户界面特权隔离(UIPI)、用户帐户控制(UAC)。UAC是您应该担心的问题,因为默认情况下,应用程序在Vista+上“无特权”运行,我相信您知道,您是否尝试过运行应用程序作为管理员?是的,我正在以管理员身份运行我的应用程序。我收到上一个错误0。在没有管理员权限的情况下,它返回5。您是对的。但我仍然没有在应用程序2上收到。您是否尝试将通过WndProc发送的所有邮件记录到文件中?这将是很多(通常),但您可以通过它搜索应用程序1返回的消息ID。你确定他们都是同一个身份证吗?如果你独立运行这些应用程序,它们可能是相同的,但一起运行可能会中断..谢谢你的帮助问题在于访问权限。谢谢!你能给我推荐其他的方法来达到这种行为(学习目的)吗。将字符串作为参数传递如何?