我需要知道我的应用程序何时收到一条WM_SETTINGCHANGE
消息(以前称为WM_WININICHANGE
)。
问题是TApplication中的消息泵在我有机会看到它之前将其发送到黑洞(默认处理程序):
procedure TApplication.WndProc(var Message: TMessage);
...
begin
Message.Result := 0;
for I := 0 to FWindowHooks.Count - 1 do
if TWindowHook(FWindowHooks[I]^)(Message) then Exit;
CheckIniChange(Message);
with Message do
case Msg of
WM_SETTINGCHANGE:
begin
Mouse.SettingChanged(wParam);
Default; <----------------------*poof* down the sink hole
end;
...
end;
...
end;
该过程CheckIniChange()
不会引发我可以处理的任何事件,Mouse.SettingChanged()
.
一旦代码路径到达Default
,它就会被发送到DefWindowProc
排水孔,再也不会被看到(因为 WndProc 所做的第一件事就是将 设置Message.Result
为零。
我希望将处理程序分配给 TApplicationEvents.OnMessage 事件:
procedure TdmGlobal.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
case Msg.message of
WM_SETTINGCHANGE:
begin
// Code
end;
end;
end;
但是 OnMessage 事件仅针对通过消息泵来的消息引发。由于WM_SETTINGCHANGE
消息已“处理”,因此它永远不会看到
PeekMessage
TranslateMessage
DispatchMessage
系统。
我如何响应 windows 广播WM_SETTINGCHANGE
?