Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何禁用然后启用MessageBox中的重试按钮? 我有以下非托管C++代码: MessageBox( NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);_C++_Winapi_Unmanaged - Fatal编程技术网

如何禁用然后启用MessageBox中的重试按钮? 我有以下非托管C++代码: MessageBox( NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);

如何禁用然后启用MessageBox中的重试按钮? 我有以下非托管C++代码: MessageBox( NULL, strMessage, "Cool Product", MB_RETRYCANCEL | MB_ICONEXCLAMATION);,c++,winapi,unmanaged,C++,Winapi,Unmanaged,我想禁用重试按钮10秒钟(例如),然后启用它 我怎样才能做到这一点?使用标准的MessageBox调用,您不能。要做到这一点,您需要实现自己的MessageBox。我认为标准MessageBox调用不可能做到这一点 您最好自己编写包含此功能的消息框 (或者,您可以编写一个单独的线程,持续监视屏幕,等待消息框出现,禁用重试按钮,等待10秒,然后重新启用。这并不有趣。说真的,用另一种方式来做。)就像上面说的,您需要使用MFC、ATL、原始Win32等创建自己的对话框来完成此操作 然后创建一个定时器来

我想禁用重试按钮10秒钟(例如),然后启用它


我怎样才能做到这一点?

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

我认为标准MessageBox调用不可能做到这一点

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

(或者,您可以编写一个单独的线程,持续监视屏幕,等待消息框出现,禁用重试按钮,等待10秒,然后重新启用。这并不有趣。说真的,用另一种方式来做。)

就像上面说的,您需要使用MFC、ATL、原始Win32等创建自己的对话框来完成此操作


然后创建一个定时器来启用和禁用按钮。

因为Vista可以使用taskdialog——一个比简单的消息框更复杂的对话框。更多信息和链接。

您不能直接操作MessageBox控件,但可以使用黑客。在显示对话框之前安装WH
\uu
CBT挂钩,并处理HCBT
\u
激活事件。这将为您提供消息框的HWND,以便您可以对其执行任何操作(对其进行子类化、管理其按钮并设置计时器)


你可以在James Brown的网站上找到一个带有演示代码的教程。

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


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

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