Значение WM_MSO_BROADCASTCHANGE

Какое значение имеет WM_MSO_BROADCASTCHANGE, и как бы я понял это для себя в следующий раз?

2 ответа

Решение

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

Оказывается, что "WM_MSO_BROADCASTCHANGE" не имеет установленного значения. Вы получаете значение для него динамически, вызывая RegisterMessage, См. http://msdn.microsoft.com/en-us/library/ms644947(v=vs.85).aspx

Обратите внимание, что в данном конкретном случае MS Office, по-видимому, передает сообщение, поэтому его получают только другие окна верхнего уровня.

В общем, вы можете использовать такой инструмент, как Spy++ (поставляется с Visual Studio и, возможно, также с SDK для платформы Windows), чтобы увидеть значение сообщения. В этом случае Spy ++ также регистрирует, что это зарегистрированное сообщение.

Чтобы его прослушать, вы можете написать, например, код C#, который выглядит следующим образом.

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
  ....
class ThemeChangeCatcherpublic : Form
    {
        private const string WM_MSO_BROADCAST_NAME = "WM_MSO_BROADCASTCHANGE";

        private int WM_MSO_BROADCASTCHANGE = 0;

        internal static class NativeMethods
        {
            [DllImport("user32.dll", SetLastError=true, CharSet=CharSet.Auto)]
            internal static extern int RegisterWindowMessage(string lpString);
        }

        protected override void OnHandleCreated(EventArgs e)
        {
            base.OnHandleCreated(e);

            WM_MSO_BROADCASTCHANGE = NativeMethods.RegisterWindowMessage(WM_MSO_BROADCAST_NAME);
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_MSO_BROADCASTCHANGE)
                MessageBox.Show("gotcha!");
            else
                base.WndProc(ref m);    
        }        
    }

В большинстве случаев я бы сказал, использовать Google или MSDN. В поисках WM_TIMER на MSDN это ответ #1:

http://msdn.microsoft.com/en-us/library/ms644902(VS.85).aspx

и так имеем:

#define WM_TIMER                        0x0113

В вашем случае, поиск этой строки в Google приводит только к двум совпадениям, которые показывают разные значения - так что я не могу придумать, что вам сказать. Это в сторонней библиотеке, чья документация или код скажет вам значение? Он должен быть определен где-нибудь в заголовочном файле, если он правильный, или никто не может использовать его в своем коде. Опять же, возможно, скрытие значения является намерением. Это какое-то внутреннее Сообщение Windows, используемое надстройкой?

Другие вопросы по тегам