Мне нужно знать, когда мое приложение получит сообщение 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
?