当在Microsoft Excel中打开一个大文件(假设一个大于50MB的csv文件)时,它会打开,屏幕右下角会显示一个小进度条,并显示“按ESC取消”。如果在文件打开时按ESC键,它将取消操作。如果文件说200MB,则Excel打开文件所需的时间可能是20秒或更长,因此可以取消。
在我的VSTO插件中,我希望能够取消大型工作簿的文件加载操作。由于我也在对文件进行后期处理,我想有自己的对话框,在文件打开/正在处理时显示进度(打开时选框进度条和后处理的正常进度条)。在此进度表单中,我想要一个可以停止当前操作的取消按钮。
为了在Excel打开文件时显示自定义选取框进度条表单,必须在新线程上创建表单,因为我认为Excel是单线程的,因此如果在主线程上执行,表单将冻结。
我的解决方案是让这个表单在一个单独的线程上执行,然后有一个Cancel按钮,当按下Cancel按钮时,它使用SendKeys(或类似的)发送一个ESC键击。但是,这个解决方案似乎不起作用;使用发送击键的各种方法,没有任何反应或我得到此异常“消息过滤器指示应用程序正忙。(HRESULT异常:0x8001010A(RPC_E_SERVERCALL_RETRYLATER))”
我尝试发送击键的各种方法是:
//1
Globals.ThisAddIn.Application.SendKeys("{ESC}");
//also tried SendKeys.Send("{ESC}");
//2
Globals.ThisAddIn.Application.SendKeys("{ESC}", true);
Globals.ThisAddIn.Application.Wait(DateTime.Now + new TimeSpan(0, 0, 1));
//3 Nuget package to which uses SendInput from https://inputsimulator.codeplex.com/
InputSimulator inputSim = new InputSimulator();
inputSim.Keyboard.KeyPress(VirtualKeyCode.ESCAPE);
//4 sending keystorkes via Window hooking http://stackoverflow.com/questions/10407769/directly-sending-keystrokes-to-another-process-via-hooking
我还使用BeginInvoke尝试了所有这些方法,但没有成功。
有没有人有任何关于我如何获得取消按钮以成功使用Excel注册ESC键的建议?我猜测解决方案与处理线程的方式不同。