【问题标题】:How do I disable and then enable the Retry button in a MessageBox?如何禁用然后启用 MessageBox 中的重试按钮?
【发布时间】:2010-09-15 14:52:04
【问题描述】:

我有以下非托管 C++ 代码:

MessageBox( NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);

我想禁用 RETRY 按钮 10 秒(例如),然后启用它。

我该怎么做?

【问题讨论】:

    标签: c++ winapi unmanaged


    【解决方案1】:

    就像@ffpf 所说,您需要使用 MFC、ATL、原始 Win32 等制作自己的对话框来执行此操作。

    然后创建一个可以启用和禁用按钮的计时器。

    【讨论】:

      【解决方案2】:

      您不能直接操作 MessageBox 控件,但可以使用 hack。在显示对话框之前安装 WH_CBT 挂钩并处理 HCBT_ACTIVATE 事件。这将为您提供消息框的 HWND,以便您可以对它做任何您想做的事情(子类化它,管理它的按钮并设置一个计时器)。

      您可以在 James Brown 的网站上找到带有演示代码的 Custom MessageBox 教程。

      【讨论】:

        【解决方案3】:

        使用标准 MessageBox 调用,您不能。为此,您需要实现自己的 MessageBox。

        【讨论】:

          【解决方案4】:

          我认为标准消息框调用不可能做到这一点。

          您最好自己编写包含此功能的消息框。

          (或者,您可以编写一个单独的线程,持续观察屏幕等待该消息框出现,禁用重试按钮,等待 10 秒然后重新启用它。不好玩。说真的,换一种方式。)

          【讨论】:

            【解决方案5】:

            从 Vista 开始,您可以使用 taskdialog -- 一个比简单消息框更复杂的对话框。更多信息和链接here.

            【讨论】:

            • 即使没有 Vista,任务对话框也是比消息框更好的方法。有一些实现可以在 Vista 之前的系统上运行,如果您不需要同时使用所有功能,那么实现也不难。
            • 看起来您实际上不能启用和禁用按钮,只能(可能)添加和删除。
            【解决方案6】:

            我同意 efotinis 的观点,这不是不可能的,一旦你有了 HWND,你就可以用它做任何你想做的事。这只是“你真的需要这些技巧还是只创建自己的消息框对话框更好”的问题?

            另一种查找 HWND 的不太好的方法(这显然可以让您访问消息框中的所有内容)是启动一个线程并使用 EnumChildWindows 循环轮询消息框句柄。但我个人更喜欢 WH_CBT 钩子。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-06
              相关资源
              最近更新 更多