如何在插入图像时保持Excel互操作不会窃取焦点

时间:2009-04-24 20:35:09

标签: c# excel com interop

我正在使用Excel COM互操作将图像(特别是EPS)插入电子表格中。图像插入正常,但Excel忽略所有可见/背景设置并窃取焦点显示一个对话框,如“导入图像”。对话框只保留一小部分,但它会使屏幕闪烁,更糟糕的是,当我一次插入许多图像时,它可以独占系统几秒钟(包括从前台进程中窃取按键)。 / p>

我正在设置背景选项,如下所示:

Excel.Application xlApp = new Excel.Application();
xlApp.Visible = false;
xlApp.ScreenUpdating = false;
xlApp.DisplayAlerts = false;
Excel.Worksheet worksheet;
//....
worksheet.Pictures(Type.Missing).Insert(filename,Type.Missing); //steals focus

如何让Excel在此处保留在后台?

3 个答案:

答案 0 :(得分:3)

我怀疑这是由Microsoft许可的组件造成的。

处理此类情况的唯一方法是截取相应的低级Windows消息并使用Win32 hook

阻止它

最简单的方法就是使用CBT钩子,而且,相信我,它并不漂亮。 CBT代表“基于计算机的培训”。它是一种古老而近乎过时的技术,旨在创建培训应用程序,以观察您正在做的事情并做出相应的响应。它唯一的好处就是在您无法访问的代码中挂钩并阻止窗口激活。您可以截取HCBT_ACTIVATE代码并阻止窗口激活。

这可能需要用C或C ++完成。

答案 1 :(得分:1)

与常识相反,设置xlApp.ScreenUpdating = true;可防止焦点窃取! (http://developer.android.com/guide/components/fragments.html#Creating

答案 2 :(得分:0)

我不确定我对你的问题有一个好的答案(我会留下评论,但显然我还没有足够的声誉),但是如果它有用,我经常也会禁用事件

xlApp.EnableEvents = False

显然,当您依赖代码中的Excel事件时,您必须对此设置敏感,但为了防止在您插入时发生一些不需要的事件,这可能会有所帮助。

祝你好运!