Excel加载焦点不会返回到活动工作表

我已经在c#中开发了一个excel插件(VSTO),并在其中有一个树视图的任务窗格。 当我点击树形视图时,它会加载一些数据到excel工作表。 但加载后,焦点仍然留在树视图上,所以我不能直接在单元格中input,而无需点击表单。 只要单击树形视图填充图纸,我就需要将焦点放在激活的工作表上。 我尝试了下面的方法,但没有运气

ActiveSheet.Select() ActiveSheet.Activate() 

而我也尝试设置范围。 另一件事是当我添加一个断点到ActiveSheet.Activate()它击中断点后,但没有它仍然保持焦点在任务窗格上工作。

努力之后我发现了一个简单的解决scheme

SendKeys.Send( “{F1}”);

这简单地解决了我的问题。 但是奇怪,因为实际上F2是正确的钥匙,但它不起作用。 只有F1的作品。

SendKeys.Send(“{F1}”)方法不适合我。 我认为发生的事情是,我们正试图激活一个窗口,认为它已经被激活,除非它没有被完全激活。

所以,我们需要激活另一个窗口,以确保Excel得到适当的停用,然后重新激活Excel。 但是,我们不希望用户看到任何闪烁或古怪。 为我工作的方法是:

  1. 获取桌面的句柄
  2. 调用桌面句柄上的SetForegroundWindow
  3. 在主Excel句柄上调用SetForegroundWindow

[的DllImport( “USER32.DLL”)]
public static extern int GetDesktopWindow();

[DllImport(“user32.dll”,CharSet = CharSet.Auto)]

private static extern bool SetForegroundWindow(IntPtr hWnd);

 SetForegroundWindow(GetDesktopWindow()); SetForegroundWindow(excelHandle); 

对于任何使用Add-in Express创buildExcel加载项的人,都可以使用ADXKeyFilter事件,并将默认处理程序参数的Action属性设置为ADXKeyFilterAction.SendToHostApplication