按 Esc 关闭任务对话框

Posted

技术标签:

【中文标题】按 Esc 关闭任务对话框【英文标题】:Dismissing a TaskDialog by pressing Esc 【发布时间】:2019-06-26 15:58:00 【问题描述】:

在我维护的软件中,我计划将旧的 MessageBox 替换为 TaskDialog,正如 Microsoft UI 指导方针在很久以前所建议的那样。

我需要解决的主要问题如下:

通过MessageBox(... ,MB_OK) 调用的旧消息框(因此只包含一个确定按钮)可以通过按 Esc 键来关闭。

但是不能通过按 Esc 来关闭仅包含 OK 按钮的 TaskDialog。这可能会对用户体验产生负面影响。

我尝试通过pfCallback字段使用TaskDialogIndirect,但如果任务对话框中没有取消按钮,回调函数甚至不会被调用。

有什么想法可以让 Esc 关闭这样的任务对话框吗?

【问题讨论】:

这有点道理。如果对话框没有取消按钮,那么 ESC 为什么要起作用。不就是加个取消按钮的解决方案吗? @DavidHeffernan 是的,确实有效!如果任务对话框中只有一个 Cancel 按钮,则 Esc and Enter 关闭对话框,这正是我想要的。我唯一需要做的就是将取消按钮标记为“确定”而不是使用TaskDialogIndirect 很容易的“取消”。你拯救了我的一天。 这听起来是个糟糕的主意。取消意味着您正在退出某个操作并撤消/不执行它。 ESC 调用取消。 ESC 不应调用标记为 OK 的按钮。也许这是您在应用程序对话框中更正用户体验的机会。 @DavidHeffernan 我认为您误解了评论。如果我用文本“OK”标记IDCANCEL 按钮,那么用户只会看到一种带有一个OK 按钮的消息框。然后他只需按 Esc 或 Enter(就像旧的 MessageBox 一样),对话框就会消失。仅当任务对话框中有一个确定按钮时,我才会使用此 hack。正如我之前提到的,包含单个 OK 按钮的旧 MessageBox 可以通过 Enter 和 Esc 关闭。 不,有 1000 名用户不习惯在显示“确定”按钮并按下 Esc 时关闭任务对话框。如果它以这种方式工作,你就不需要问这个关于如何破坏对话框的设计行为的问题。 【参考方案1】:

TASKDIALOGCONFIG 结构的 MSDN 文档对TDF_ALLOW_DIALOG_CANCELLATION 标志(dwFlags 成员)进行了如下说明:

表示即使在 dwCommonButtonspButtons 成员。

此标志还为对话框提供了一个系统菜单(Alt+Space),因此您也可以通过按 Alt+Space 和系统菜单的“关闭”项中的下划线字符来关闭它。

【讨论】:

以上是关于按 Esc 关闭任务对话框的主要内容,如果未能解决你的问题,请参考以下文章

Swing:按下 ESC 键时如何关闭对话框?

使用Esc键关闭对话框

关闭程式

Qt 销毁模态对话框

一不小心把windows资源管理器给结束任务了 电脑黑屏了 怎么处理

在无模式对话框中阻止 ESC 和 Enter 键(Win32,非 MFC)