我有第三方加密库,如果密钥创建失败,可能会创建一个MessageBox。失败可能是由于糟糕的随机数生成或其他稀有因素引起的,并且在大多数情况下,再次尝试将导致成功。我的代码在决定失败之前最多会尝试三次密钥创建。
现在,问题是程序可能会与自动化一起使用。如果在自动化期间创建了MessageBox,它将永久阻止该过程,因为没有人可以单击“确定”按钮。
有没有人知道在创建此消息框时捕获的方法并自动关闭它?
任何东西都是公平的游戏,只要它不会让安全套件生气。这意味着没有挂钩或代码隧道。
总之,我需要在创建MessageBox时捕获并关闭它。 MessageBox的创建超出了我的控制范围。不能在运行时修改代码。
另外,我注意到还有一些其他类似的问题,但它们没有相同的要求。
编辑:补充说明,我可以通过搜索所有窗口找到消息框,直到我找到一个匹配标题,然后发送WM_CLOSE消息,但我不认为这是一个很好的解决方案。我也无法保证已经/将要显示消息框,或者在我的通话结束后显示多长时间。它可以立即显示,可以在1200毫秒后显示,或者根本无法显示。
答案 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)
创建一个新线程。如果您的函数失败并打开了一个消息框,请通过循环浏览窗口(GetTopWindow
,GetNextWindow
)并将窗口的进程ID与{{1}返回的进程ID进行比较来获取消息框的句柄。 }}
或者,你可以避免所有艰苦的工作,并且只是绕道而行的MessageBox API 。这不是很难,如果你不想为弯路付费,你可以手动完成。