【发布时间】:2012-02-11 03:07:18
【问题描述】:
我正在开发通过 com 自动化 Excel 的应用程序。 我遇到的问题是,有时当用户按下一些键盘按钮时 Excel 窃取焦点并进入单元格编辑状态,这导致我的应用程序崩溃。 防止键盘消息到达 Excel 的最佳方法是什么。 我尝试了不成功的 CBT 钩子和 GetMessage 钩子。还有其他方法吗?
【问题讨论】:
标签: excel winapi ms-office hook
我正在开发通过 com 自动化 Excel 的应用程序。 我遇到的问题是,有时当用户按下一些键盘按钮时 Excel 窃取焦点并进入单元格编辑状态,这导致我的应用程序崩溃。 防止键盘消息到达 Excel 的最佳方法是什么。 我尝试了不成功的 CBT 钩子和 GetMessage 钩子。还有其他方法吗?
【问题讨论】:
标签: excel winapi ms-office hook
Excel 2010 的 Application 对象具有 Interactive 属性。将其设置为 false,Excel 将阻止所有键盘和鼠标输入,但您显示的任何对话框除外。
Application.Interactive = False
我不确定 Interactive 是何时添加的,但我认为它在 Excel 2000 中不存在。
【讨论】:
Application.Cursor = xlWait 将鼠标指针更改为沙漏。完成后不要忘记将其设置回xlDefault。
最简单的方法可能是使用BlockInput(),它会阻止整个桌面上的鼠标和键盘输入:如果您只想在短时间内阻止用户,这很有用。
或者,如果您只想阻止输入到达特定的 exe,请使用 SetWindowsHookEx(WH_KEYBOARD_LL, ...) - 根据 MSDN,您可以从 hookproc 返回 -1 以导致输入被忽略:
如果 nCode 大于或等于 0,[...] 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。
WH_KEYBOARD_LL 挂钩的一个很好的特性是它们不需要单独的 DLL,您可以在自己的 EXE 中完成所有操作。但只能针对 excel 应用程序的 threadID 使用它;如果您有应用程序的 HWND,请使用 GetWindowThreadID() 来获取它。
【讨论】: