C# 通过SendKeys取消对excel VBA项目的保护
我在解除受保护excel的VBA项目的保护时遇到问题C# 通过SendKeys取消对excel VBA项目的保护,c#,excel,vba,C#,Excel,Vba,我在解除受保护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 + "~
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)
这方面有什么帮助吗?为什么它能工作?您部署到了什么样的环境中 程序集似乎没有在完全信任的安全上下文中运行,这就是为什么不允许某些API调用的原因 从: 对Shell函数的调用需要完全信任(SecurityException类) 更新 根据OP的评论,似乎确实在COM+容器中承载的程序集没有被授予FullTrust
为了解决此问题,您可以考虑将一个单独的程序集部署到目标机器上的GAC中,并使用FultReal信任并启用该程序集上的AuthPrimeRealStistDel来电选项。此程序集必须是在其他COM+托管程序集上调用SendKeys的程序集
但最终,正如其他人指出的那样,这可能不是正确的解决方案。一般来说,SendKeys的使用应该非常少,可能还有其他更好的方法来实现您的目标。这就撇开了一个问题,即是否有人真的可以依靠SendKeys在productiion环境中解除对VB项目的保护,或者甚至是否应该这样做!我们使用经典的asp作为前端。我们将把dll对象部署到com+应用程序中您尝试使用哪个版本的Excel,以及您使用它的目的是什么?是报告还是计算?我们使用的是office 2010,我们在报告和计算中都使用它。我可以问一下,为什么要在运行时取消对VB项目的保护?我们要求在运行时向excel中添加一个新宏。老实说,这不是您想要做的。您只需打开Excel文件,在Visual Basic编辑器项目资源管理器中手动取消对其的保护,然后在保存宏工作簿并使其可供用户使用之前添加新代码。您可能希望使用API,如图所示