Поздний ответ, я знаю, но так случилось, что недавно я сам искал ответ на этот вопрос, так что это может помочь другим заблудшим гуглерам ...
Оказывается, что "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);
}
}