【问题标题】:How to catch CTRL+S key in Excel 2010/2013/2016 Add-In如何在 Excel 2010/2013/2016 加载项中捕获 CTRL+S 键
【发布时间】:2017-12-14 23:02:30
【问题描述】:

我有一个旧版 Office 2007 加载项,其中基于 user32.dll SetWindowsHookEx 的自定义函数用于拦截线程上的 CTRL+S 按键事件并执行自定义文件保存。该功能在 Windows7 中运行良好,但在 Office 2016 和 Windows10 环境中无法正常运行。我不知道如何修复这个错误。

所以,我尝试了另一种方法来拦截 CTRL+S。我将ThisAddIn.Application.OnKey("^{s}", "MySaveMethod") 函数与以编程方式导入活动工作簿的宏一起使用。这种方法有效。但是,公司的组策略要求对添加到工作簿的所有宏进行签名,而以编程方式对宏进行签名似乎是不可能的。

我想知道其他开发人员如何在 Excel 2010/2013/2016 加载项中捕捉按键事件或开发键盘快捷键?任何想法都非常感谢。

谢谢

【问题讨论】:

  • 你考虑过Workbook_BeforeSave事件吗?您可以使用应用程序事件处理程序(see CPearson.com for details)在插件中对此进行编码
  • 谢谢你,克里斯,你的建议。我尝试使用 BeforeSave 事件,它很好地捕获了 CTRL+S。我的问题是在自定义保存代码中调用了 Workbook.Save 方法。此方法触发 BeforeSave 事件,我有一种无限逻辑循环,因为程序控件返回到调用自定义保存代码的 CTRL+S 拦截器。我试图弄清楚如何检测 BeforeSave 事件是否由 Workbook.Save 方法触发,以便在 CTRL+S 拦截器中忽略它。

标签: macros vsto excel-addins


【解决方案1】:

尝试使用重用命令。 https://msdn.microsoft.com/en-us/library/bb462633(v=office.12).aspx

在您的功能区中添加这些

<commands> 
 <command idMso="FileSave" onAction="mySave" /> 
</commands> 

在ribbon.cs中

public void mySave(IRibbonControl control, bool cancelDefault)
{
    //Do whatever you want
    //Don't forget to save manually
}

【讨论】:

  • 感谢基鲁的建议。我会尽快尝试,并让您知道它是否适合我。
  • 我查看了代码,发现在我开始更改之前,此方法已在此应用程序中实现。显然,它没有用。我的解决方案是使用 Workbook_BeforeSave 事件处理程序和文档自定义属性。我创建了文档自定义属性以将其用作从 Workbook.Save 或 Workbook.SaveAs 方法内部触发 BeforeSave 事件的指示器。
  • 在 Workbook_BeforeSave 代码中分析了自定义属性,以停止自定义保存函数的递归调用。指标自定义属性在 Workbook.Save 调用之前设置为 true,在调用之后设置为 false。感谢 Kiru 和 Chris 提供有用的建议。
猜你喜欢
  • 2017-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
相关资源
最近更新 更多