0

我在取消保护受保护的 excel 的 VBA 项目时遇到问题。

IntPtr hWnd = FindWindow(null, ES.oXL.VBE.MainWindow.Caption);//Find window
  if (hWnd != IntPtr.Zero)
  {
      bool ret = BringWindowToTop(hWnd); //Bring VBE to top.
  }

  SendKeys.SendWait("%{F11}%TE" + strPassword + "~~%{F11}");
  SendKeys.SendWait("{ENTER}");
  SendKeys.SendWait("xyz");
  SendKeys.SendWait("{ENTER}");

我写了这样的代码来解除对 VBA 项目的保护。它在调试应用程序时工作正常。

我们使用 com 对象模型。当我在 dll 配置单元中应用相同的 dll 时,调用我遇到错误的函数

System.ComponentModel.Win32Exception: Access is denied at System.Windows.Forms.SendKeys.SendInput(Byte[] oldKeyboardState, Queue previousEvents)

对此有何帮助?

4

1 回答 1

1

你部署到什么样的环境中?

似乎程序集没有在完全信任的安全上下文中运行,这就是不允许某些 API 调用的原因

文档中:

对 Shell 函数的调用需要完全信任(SecurityException 类)。

更新

根据 OP 的评论,似乎确实没有授予在 COM+ 容器中托管的程序集 FullTrust。

为了解决这个问题,您可以考虑使用 FullTrust 将单独的程序集部署到目标计算机上的 GAC 中,并在此程序集上启用 AllowPartiallyTrustedCallers 选项。该程序集必须是在您的其他 COM+ 托管程序集上调用 SendKeys 的程序集。

但最后,正如其他人指出的那样,这可能不是正确的解决方案。一般来说,SendKeys 应该非常谨慎地使用,并且可能还有其他更好的方法来实现您的目标..

于 2013-03-07T13:47:11.847 回答