自动关闭MessageBox

时间:2010-09-16 08:45:25

标签: c++ c windows winapi messagebox

我有第三方加密库,如果密钥创建失败,可能会创建一个MessageBox。失败可能是由于糟糕的随机数生成或其他稀有因素引起的,并且在大多数情况下,再次尝试将导致成功。我的代码在决定失败之前最多会尝试三次密钥创建。

现在,问题是程序可能会与自动化一起使用。如果在自动化期间创建了MessageBox,它将永久阻止该过程,因为没有人可以单击“确定”按钮。

有没有人知道在创建此消息框时捕获的方法并自动关闭它?

任何东西都是公平的游戏,只要它不会让安全套件生气。这意味着没有挂钩或代码隧道。

总之,我需要在创建MessageBox时捕获并关闭它。 MessageBox的创建超出了我的控制范围。不能在运行时修改代码。

另外,我注意到还有一些其他类似的问题,但它们没有相同的要求。

编辑:补充说明,我可以通过搜索所有窗口找到消息框,直到我找到一个匹配标题,然后发送WM_CLOSE消息,但我不认为这是一个很好的解决方案。我也无法保证已经/将要显示消息框,或者在我的通话结束后显示多长时间。它可以立即显示,可以在1200毫秒后显示,或者根本无法显示。

5 个答案:

答案 0 :(得分:4)

在您开始加密过程之前,请安装WH_CBT hook,并在其callback中注意HCBT_CREATEWND的nCode。如果你得到一个匹配的类名('#32770(Dialog)'?),匹配的标题要么从回调中返回非零值,要么在WM_CLOSE(或{{1}后发布不起作用如果需要选择一个选项,则转到相关按钮)。在处理过程之后卸载钩子,以免弄乱应用程序弹出的每个可能的对话框。

答案 1 :(得分:3)

这听起来像是那个图书馆的糟糕设计。通常,任何类型的实用程序库(如加密)都没有调用任何类型GUI的业务(除非您明确要求它)。

此库中是否有某些配置或设置可能会禁用其消息框的使用?

如果没有,我建议你可能想要使用不同的库进行调查。毕竟,如果这个图书馆的设计师已经做过一次这种糟糕的设计决定,那么可能会有潜伏在那里的其他不幸的惊喜。

答案 2 :(得分:1)

您可以希望GetForegroundWindow找到它,但这可能会遇到其他应用程序。更强力的方法是使用EnumWindows遍历所有窗口,查找具有与库所示的标题相同的标题或文本的内容。

答案 3 :(得分:0)

我曾经通过向某些控件发送鼠标点击事件来“远程控制”应用程序。我猜你必须在一个单独的线程中执行此操作,如果打开一个窗口,它会监视事件。非常丑陋但工作......

答案 4 :(得分:0)

创建一个新线程。如果您的函数失败并打开了一个消息框,请通过循环浏览窗口(GetTopWindowGetNextWindow)并将窗口的进程ID与{{1}返回的进程ID进行比较来获取消息框的句柄。 }}

或者,你可以避免所有艰苦的工作,并且只是绕道而行的MessageBox API 。这不是很难,如果你不想为弯路付费,你可以手动完成。

  1. 调用VirtualProtect并在MessageBox的PAGE_EXECUTE_READWRITE设置内存保护
  2. 创建一个裸体功能,并将其用作蹦床。
  3. 创建一个与MessageBox相同的函数(这将是你的钩子)
  4. 创建从MessageBox到钩子函数的跳转。