Широковещательное сообщение Windows HWND_BROADCAST - PullRequest
3 голосов
/ 03 июня 2011

Я работаю в приложении в этом приложении, я буду ждать какого-то события в приложении 1, и когда это событие произойдет, я отправлю сообщение в приложение 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 параметры

Кто-нибудь предложит мне другую альтернативу для достижения этого поведения!

Ответы [ 3 ]

5 голосов
/ 03 июня 2011
  1. Не существует такого понятия, как код с проблемой.Существует только код, который не делает то, что вы ожидали.Если вы хотите, чтобы мы рассказали вам, в чем проблема с приведенным выше кодом, вы должны сообщить нам, что вы ожидали от него (хорошо, мы можем догадаться об этом), но самое главное, что он сделал вместо ,Вы получили ошибку?Просто молча не получилось?Знаешь, это важная часть вопроса!

  2. Вы используете такие методы, как RegisterWindowMessage () и SendNotifyMessage (), определения которых вы нам не показываете.Как мы должны определить, связана ли проблема с SendNotifyMessage (), когда мы не знаем, как был объявлен SendNotifyMessage ()?

  3. В вашем приложении 2 есть WndProc, в котором вы ожидаетеполучать сообщения для окна.Это было правильно зарегистрировано?Вы уверены, что это работает?Получает ли он другие оконные сообщения?Получает ли он «MYMESSAGE», если вы отправляете его из приложения 2?

  4. HWND_BROADCAST только отправляет сообщения в окна верхнего уровня.Вы уверены, что ваше окно является окном верхнего уровня?

  5. Вы не проверяете, был ли успешен вызов RegisterWindowMessage () в Приложении 2.Как насчет проверки этого в первую очередь?

  6. "MYMESSAGE" не очень хорошее название для сообщения.Как насчет использования чего-то более уникального, такого как ваше имя и фамилия, или создания guid и использования его строкового представления в качестве имени для вашего сообщения?

3 голосов
/ 03 июня 2011

HWND_BROADCAST довольно опасно .. Я знаю, что это маловероятно, но что, если другое приложение также обработало ваше сообщение ??

Во всяком случае, кроме этого, вы взяли чтение http://msdn.microsoft.com/en-us/library/ms644953.aspx

Самый простой способ отладить проблему с вашим кодом (так как он основан на WINAPI) - это использовать GetLastError. Вы всегда должны проверять возвращаемое значение методов, чтобы убедиться, что они успешны, поэтому убедитесь, что он возвращает ноль (что означает, что он работал). Если это не так, и вы получаете ошибку, например, отказ в доступе, попробуйте запустить с отключенным UAC или с правами администратора (Vista +).

Когда сообщение заблокировано UIPI, последняя ошибка, полученная с GetLastError, установлен в 5 (доступ отказано).

2 голосов
/ 03 июня 2011

Следующий код работает очень хорошо,

Серверная сторона.

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