我最近意识到 Windows 对话框管理器显然尊重不可见控件的助记符。例如,如果我"&Foo"
通过 隐藏对话框上标记的按钮ShowWindow(SW_HIDE)
,则按 Alt+F 会触发该按钮。
为什么 Windows 会这样做?(我猜很久以前某个地方的某个开发人员可能使用隐藏控件作为实现隐藏键盘快捷键的穷人的方式,并且为了向后兼容而保留了这种不直观的行为。)
更重要的是:在我检查整个代码库以审核所有ShowWindow
站点并使它们显式禁用隐藏控件之前,是否有任何体面的方法可以在对话框管理器中调整此行为?我有点惊讶于我找不到太多关于此的信息/抱怨;我能找到的最好的是看起来像是由第三方存档的旧 Microsoft KB 文章,该文章建议WM_GETTEXT
通过子类化来覆盖每个控件的处理程序。(对于每个可能隐藏的控件,这似乎是相当严厉的事情。)
(另请注意,该文章讨论的是禁用控件,而不是隐藏控件,因此对话框管理器也不会忽略禁用控件。这也可以通过创建一个隐藏的禁用复选框来观察,该复选框与一个可见的启用的复选框共享助记符。按下助记键将焦点移至可见复选框,但不会像通常那样切换它,就像在典型的助记符冲突情况下那样。)