アプリケーションがいつ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
ですか?