【发布时间】:2011-02-18 19:16:17
【问题描述】:
我需要知道我的应用程序何时收到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?
【问题讨论】:
标签: windows delphi winapi messages delphi-5