我正在为IE编写附加组件。我需要在外部点击时关闭模态对话框。
到目前为止,我已经使用WM_NCACTIVATE接收这些通知,但似乎在Windows 7(IE8)上我没有收到此消息(我运行的是低完整性,我已经用spy ++验证了它;它似乎它在我运行高完整性时会起作用 - 很奇怪的东西。)
我尝试使用常规鼠标钩子来处理DeskBand UI线程。我确实得到了除了对话框之外的所有鼠标事件。
所以我转向使用全局低级鼠标钩子(WH_MOUSE_LL)。 这一切都很好但是从一些非常奇怪的原因我点击任何一个标题栏按钮后得到5-10秒的冻结。
经过一些在线研究后,我意识到这是一个常见的问题,但我找不到解决方案。有些人说这是性能问题,但即使我的钩子函数只调用“CallNextHook”,它仍然会发生。
关于如何修复它或其他想法以关闭外部点击模式对话框的任何想法?
答案 0 :(得分:1)
我通过删除WH_MOUSE_LL来修复此问题。 这在Windows XP中运行良好,但冻结了整个计算机,有时直到我打开和关闭计算机。
我认为他们没有修复这个错误是荒谬的。 这浪费了我很多时间。
答案 1 :(得分:0)
我在低级鼠标钩子中遇到了这个问题,打开上下文菜单可能导致系统冻结一两秒。
这是一个优先倒置问题。尝试通过调用SetThreadPriority来提高安装挂钩的线程优先级。
答案 2 :(得分:0)
受过教育的猜测:我怀疑,因为你是一个IE插件,你运行的是一个低完整性的过程(这就是IE的保护模式的工作方式)。默认情况下,低完整性进程不能将窗口消息发送到中等或高完整性进程。标题栏可能是IE框架的一部分,这可能是一个中等完整性的过程。在你的钩子处理中,你可能会发送一条额外的消息。例如,由于在对话框外单击,您可能正在发送消息以关闭对话框。完整性机制会阻止消息,因为您正在跨越低完整性/中等完整性边界。五秒钟后,系统确定该应用程序已无响应,设置为取消原始点击消息。
换句话说:从低完整性过程设置低级钩子几乎肯定是个坏主意。
(一般来说,全局钩子通常是一个坏主意,因为它们会对系统中的所有UI进程施加成本。其他程序不应该为您的程序支付税款以使其正常运行。)
Windows中的模态对话框具有“确定/取消/关闭”命令按钮。你的不应该是一个例外。通过点击离开对话来解除对象与设计模型相反,因此您可能无法实现此功能,即使您管理了一个脆弱的黑客攻击,也可能会让您的用户感到困惑和烦恼。
Windows中的其他元素,如弹出窗口或下拉菜单,通过捕获鼠标(参见SetCapture)完成近距离点击,这允许菜单代码查看鼠标何时做窗外的事。但是对于对话框来说,这将非常困难,因为对话框具有也需要与鼠标交互的子控件。捕获鼠标将阻止孩子获得他们需要的信息。
您需要与设计此功能的任何人重新审核点击后离线的决定。任何实现它的尝试都将是一个脆弱的黑客,并可能使用户感到困惑。