VSTO取消工作簿通过发送按键打开事件

在Microsoft Excel中打开一个大文件(可以说是一个大于50MB的csv文件)时,会在屏幕右下angular打开一个小进度条,并显示“按ESC取消”。 如果在打开文件时按ESC键,则会取消操作。 如果文件是200MB,Excel打开文件的时间可以是20秒或更长,所以有能力取消。

在我的VSTO插件,我想有能力取消大型工作簿的文件加载操作。 因为我正在做文件的后期处理,我想有我自己的对话框,显示文件正在打开/正在处理(打开时滚动进度条,和正常进度条后处理)进度。 在这个进度表上,我想要一个取消button,可以停止当前的操作。

为了在Excel打开文件时显示自定义选取框进度条窗体,必须在新线程上创build窗体,因为我相信Excel是单线程的,所以如果在主线程上执行,窗体将冻结。

我的解决scheme是让这个表单在一个单独的线程上执行,然后有一个Cancelbutton,当按下Cancelbutton时,它使用SendKeys(或类似的)来发送ESC键击。 但是,这个解决scheme似乎并不奏效。 使用发送按键的各种方法,或者什么都不会发生,或者我得到这个exception“消息filter指示应用程序正忙(从HRESULTexception: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的方法,没有任何成功。

有没有人有任何build议,我怎样才能得到一个取消button成功注册一个ESC击键与Excel? 我猜测解决scheme有不同的处理线程。