Pregunta

¿Cuál es el valor de WM_MSO_BROADCASTCHANGE, y cómo habría que averiguarlo por mí mismo la próxima vez?

¿Fue útil?

Solución

Una respuesta tardía, lo sé, pero a medida que pasa poco estuve buscando la respuesta a esta pregunta a mí mismo, así que esto puede ayudar a otros empleados de Google errante ...

Resulta que "WM_MSO_BROADCASTCHANGE" no tiene ningún valor establecido. Se puede obtener un valor para ella dinámicamente llamando RegisterMessage. Ver http://msdn.microsoft.com/en -US / library / ms644947 (v = vs.85) .aspx

Tenga en cuenta que en este caso particular MS Office aparece para transmitir el mensaje, por lo que sólo otras ventanas de nivel superior lo recibirá.

En general, se puede utilizar una herramienta como Spy ++ (proporcionado con Visual Studio y, probablemente, la plataforma de Windows SDK también) para ver cuál es el valor de un mensaje es. En este caso, Spy ++ también registrará que se trata de un mensaje registrado.

Para detectar que se podría escribir algo de código C #, por ejemplo, que es similar al siguiente.

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

Otros consejos

En la mayoría de los casos, yo diría que el uso de Google o MSDN. La búsqueda de WM_TIMER en MSDN convierte a esta como la respuesta # 1:

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

y así tenemos:

#define WM_TIMER                        0x0113

En su caso, una búsqueda de esa cadena en Google se convierte en imagen sólo dos partidos, que muestran diferentes valores - así que no puedo pensar en lo que le diga. ¿Es esto de una biblioteca de terceros cuya documentación o el código que le dirá el valor? Tiene que ser definido en un archivo de cabecera en alguna parte, si es correcta, o nadie pueda utilizarlo en su código. Por otra parte, quizá ocultando el valor es la intención. ¿Esto es una interna de sólo mensajes de Windows utilizada por un complemento?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top