Bueno, he de hacer una aclaración a mi post anterior.
El sistema funciona tal cual, pero SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0); envía a "todas" las ventanas top-level. He comprobado que algunos elementos del Microsoft Office reaccionan mal a ese mensaje y se cuelgan.
Como la idea me sigue pareciendo buena, he creado un código para enviar el mensaje a todas las ventanas de una determinada clase (ClassName) con lo que el "bug" queda solucionado. Publico el código, considero que puede ser interesante para otras utilidades también.
Código:
// Estructura con los datos del mensaje a enviar y el nombre de la clase de ventana
struct TClassMsg{
UINT Msg;
WPARAM wParam;
LPARAM lParam;
char* ClassName;
};
BOOL CALLBACK EnumWindowsProc(HANDLE Handle, LPARAM lParam)
{
int SizeBuffer = 256;
char* Buffer = new char[SizeBuffer+1];
TClassMsg *ClassMsg = (TClassMsg*)lParam;
int S = GetClassName(Handle, Buffer, SizeBuffer);
if(S)
if(stricmp(Buffer, ClassMsg->ClassName)==0){
// Si coincide el ClasName con el deseado, se envía el mensaje
PostMessage(Handle, ClassMsg->Msg, ClassMsg->wParam, ClassMsg->lParam);
}
delete Buffer;
return true;
}
typedef BOOL (__stdcall *TP)();
void PostMessageToWindowClass(char *ClassName, UINT Msg, WPARAM wParam, LPARAM lParam)
{
TClassMsg ClassMsg;
ClassMsg.Msg = Msg;
ClassMsg.wParam = wParam;
ClassMsg.lParam = lParam;
ClassMsg.ClassName = ClassName;
// Enumero las ventanas
EnumWindows((TP)EnumWindowsProc, LPARAM(&ClassMsg));
}
Y para usarlo con los fines que propongo:
Código:
PostMessageToWindowClass("CabinetWClass", WM_COMMAND, 0x0A220, 0);
Por supuesto que puede ser mejorado y si alguien lo hace incluso lo agradezco.
Saludos.