确定popup窗口是否在Excel的前台

我正在写一个Excel的VSTO加载项,我注意到如果我locking工作表和密码保护它(所以只有我的加载项可以写入,但用户可以查看它),如果用户尝试编辑他们得到的表格“这张表被locking”popup。 如果那个提示还在等待用户input时,加载项试图写入表单,Excel崩溃。 写入表单的行为涉及到解除保护,写入数据,然后再次locking。 该外接程序通过串口捕获外部数据,因此可以随时写入数据。

要重新创build:1.使用加载项locking工作表。 2.用户尝试编辑工作表内容3.提示用户由于locking而无法编辑工作表的内容。 4.数据进入串行端口,插件尝试解锁,写入数据并在用户有机会确认抛出的提示之前locking工作表。 5. Excel字节的灰尘。

有什么build议么? 我正在想着维护一个隐藏的“主”表单和可见的表单,只是使用Excel公式或命名范围来引用隐藏的表单。 然而,这可能会对用户进行编辑和潜在的数据损坏。 数据必须尽可能不可编辑。

更新:我会满意捕捉COMException,所以它不会杀死Excel,但是一般的“catch(Exception ex)”似乎没有帮助。

在VBA中,您可以使用UserInterFaceOnly:= True来保护工作表。 这意味着代码仍然可以写入表单。 从这个链接看来,对于VSTO插件也是如此。

如果检查失败,执行写入操作的退出函数,您可以放置​​检查以确保工作表处于交互模式或活动单元格不为空

private bool IsExcelInteractive() { try { Globals.ThisAddIn.Application.Interactive = Globals.ThisAddIn.Application.Interactive; return true; } catch { return false; } } 

这个问题显然是

 catch(Exception) 

当它涉及到一个COMException时,并不像一般的函数那样工作。 添加线

 using System.Runtime.InteropServices; 

然后添加

 catch(COMException) 

我的尝试… catch块允许我更好地处理错误。 将其与一些代码混合使用几次后重试失败的操作

 SendKeys.SendWait("{ESC}"); 

似乎让事情变得更好。 然而,盲目地将退出键发送到最前面的程序可能会引起一些问题,但是我不能无休止地等待可能或可能不注意清除屏幕上的问题的用户。 这似乎导致串行端口停止缓冲数据,只是丢弃,如果处理不够快。

而不是单击单元格上执行此操作,您可以在function区中添加一个button,并在其单击执行此任务,这种方法将摆脱popup窗口