0

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

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

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

我怎样才能做到这一点?

4

6 回答 6

1

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

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

于 2008-10-06T20:36:25.927 回答
1

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

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

于 2008-10-06T20:54:25.550 回答
0

使用标准 MessageBox 调用,您不能。您需要实现自己的 MessageBox 才能做到这一点。

于 2008-10-06T20:33:55.027 回答
0

我不相信标准的消息框调用是可能的。

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

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

于 2008-10-06T20:35:16.053 回答
0

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

于 2008-10-06T20:45:08.127 回答
0

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

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

于 2008-10-06T21:15:07.300 回答