Ich muss wissen, wann meine Bewerbung eine WM_SETTINGCHANGE
Nachricht (früher bekannt als WM_WININICHANGE
).
Das Problem ist, dass die Nachrichtenpumpe in TAnwendung schickt sie in ein schwarzes Loch (Standardhandler), bevor ich sie sehen kann:
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;
Das Verfahren CheckIniChange()
löst kein Ereignis aus, mit dem ich umgehen kann, und auch nicht Mouse.SettingChanged()
.
Und sobald der Codepfad die Default
wird es über die DefWindowProc
Abflussloch, um nie wieder gesehen zu werden (da das erste, was die WndProc tut, das Setzen des Message.Result
auf Null.
Ich hatte gehofft, einem TApplicationEvents.OnMessage-Ereignis einen Handler zuzuweisen:
procedure TdmGlobal.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
case Msg.message of
WM_SETTINGCHANGE:
begin
// Code
end;
end;
end;
Das OnMessage-Ereignis wird jedoch nur für Nachrichten ausgelöst, die über die Nachrichtenpumpe eingehen. Da die WM_SETTINGCHANGE
Nachricht "bearbeitet" wird, sieht sie nie die
PeekMessage
TranslateMessage
DispatchMessage
System.
Wie kann ich auf die Windows-Sendung reagieren? WM_SETTINGCHANGE
?