【发布时间】:2014-07-11 04:22:33
【问题描述】:
当用户更改其 Windows 区域设置中的日期格式时,我们有一个应用程序行为异常。 (是的,解决方案是解决不当行为——不是重点。)
更改设置会向所有应用程序广播WM_SETTINGCHANGE 消息。我们试图通过忽略此消息来避免我们的问题,并保持日期格式不变(目前,作为修补程序)。
无论我做什么,TMonthCalendar 组件仍会更改其格式,TDateTimePicker 使用TMonthCalendar 作为其弹出窗口。
我试过了(结果都一样):
-
覆盖
TForm::WndProc()void __fastcall TfrmMainWindow::WndProc( TMessage & msg ) { if( msg.Msg == WM_SETTINGCHANGE ) return; // ignore TForm::WndProc( msg ); } - 使用
Application->HookMainWindow( hookWindowsMessage );设置挂钩 - 设置
TApplication.UpdateFormatSettings = false; - 设置
Application->OnEvent = onApplicationEvent;以捕获所有事件...但不幸的是,此特定情况属于“OnMessage 仅接收发布到消息队列的消息,而不是直接使用 Windows API SendMessage 函数发送的消息”。规则。
似乎覆盖WndProc() 几乎是一个好主意,只是它只影响那个窗口,而不是整个应用程序。我以为这就是 Application->HookMainWindow() 的用途,但显然不是。
有人知道如何解决或规避这个问题吗?
【问题讨论】:
-
WM_SETTINGCHANGE消息未请求更改设置的权限;这只是一个礼貌的通知。忽略该消息不会阻止更改发生。它与不处理消息相同。任何使用 Windows API 函数的控件都将开始获得与新设置相对应的行为。没有办法解决这个问题。 -
@CodyGray 非常正确,很遗憾。我可以阻止我的应用程序处理更改(见下文)。但是,我没有意识到 TMonthCalendar 实际上正在使用忽略我的应用程序设置的 Win32 API 日历。没办法。
-
仅供参考,
HookMainWindow()仅拦截专门发送/发送到TApplication窗口的消息。这不是拦截整个应用程序作为一个整体的消息的包罗万象。如果需要,请改用SetWindowsHookEx()。
标签: windows c++builder