【问题标题】:Prevent keyboard messages from reaching application防止键盘消息到达应用程序
【发布时间】:2012-02-11 03:07:18
【问题描述】:

我正在开发通过 com 自动化 Excel 的应用程序。 我遇到的问题是,有时当用户按下一些键盘按钮时 Excel 窃取焦点并进入单元格编辑状态,这导致我的应用程序崩溃。 防止键盘消息到达 Excel 的最佳方法是什么。 我尝试了不成功的 CBT 钩子和 GetMessage 钩子。还有其他方法吗?

【问题讨论】:

    标签: excel winapi ms-office hook


    【解决方案1】:

    Excel 2010 的 Application 对象具有 Interactive 属性。将其设置为 false,Excel 将阻止所有键盘和鼠标输入,但您显示的任何对话框除外。

    Application.Interactive = False
    

    我不确定 Interactive 是何时添加的,但我认为它在 Excel 2000 中不存在。

    【讨论】:

    • 这是个好主意!从来没有想过用谷歌搜索它。它是在 Excel 2007 中添加的
    • @SparcU,您可能还想使用Application.Cursor = xlWait 将鼠标指针更改为沙漏。完成后不要忘记将其设置回xlDefault
    【解决方案2】:

    最简单的方法可能是使用BlockInput(),它会阻止整个桌面上的鼠标和键盘输入:如果您只想在短时间内阻止用户,这很有用。

    或者,如果您只想阻止输入到达特定的 exe,请使用 SetWindowsHookEx(WH_KEYBOARD_LL, ...) - 根据 MSDN,您可以从 hookproc 返回 -1 以导致输入被忽略:

    如果 nCode 大于或等于 0,[...] 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。

    WH_KEYBOARD_LL 挂钩的一个很好的特性是它们不需要单独的 DLL,您可以在自己的 EXE 中完成所有操作。但只能针对 excel 应用程序的 threadID 使用它;如果您有应用程序的 HWND,请使用 GetWindowThreadID() 来获取它。

    【讨论】:

    • WH_KEYBOARD_LL 不适用于本地挂钩。仅限全球。所以当我安装它时,它会减慢计算机上的一切
    • 这是个好主意。带 DLL 的 WH_KEYBOARD 钩子解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2012-03-02
    • 2018-05-17
    • 2019-01-09
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多