Значение WM_MSO_BROADCASTCHANGE - PullRequest
       7

Значение WM_MSO_BROADCASTCHANGE

0 голосов
/ 05 ноября 2010

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

Ответы [ 2 ]

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

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

Оказывается, что "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);    
        }        
    }
0 голосов
/ 05 ноября 2010

В большинстве случаев я бы сказал, использовать Google или MSDN. Поиск WM_TIMER в MSDN приводит к ответу №1:

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

и так имеем:

#define WM_TIMER                        0x0113

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

...