Excel加载项焦点未返回到活动工作表
我在c#中开发了一个excel加载项(VSTO),其中有一个带有树状视图的任务窗格。单击树视图时,它会将一些数据加载到excel工作表中。但加载后,焦点仍保留在树状视图上,因此我无法在单元格中直接键入而不单击工作表。我需要在单击树状视图填充工作表后立即将焦点转移到活动工作表。我尝试了以下方法,但没有成功Excel加载项焦点未返回到活动工作表,excel,focus,add-in,cell,Excel,Focus,Add In,Cell,我在c#中开发了一个excel加载项(VSTO),其中有一个带有树状视图的任务窗格。单击树视图时,它会将一些数据加载到excel工作表中。但加载后,焦点仍保留在树状视图上,因此我无法在单元格中直接键入而不单击工作表。我需要在单击树状视图填充工作表后立即将焦点转移到活动工作表。我尝试了以下方法,但没有成功 ActiveSheet.Select() ActiveSheet.Activate() 我也试着设置范围。 另一件事是,当我向ActiveSheet.Activate()添加断点时,它会在到达
ActiveSheet.Select()
ActiveSheet.Activate()
我也试着设置范围。
另一件事是,当我向
ActiveSheet.Activate()
添加断点时,它会在到达断点后工作,但如果没有断点,它仍会将焦点放在任务窗格上。经过努力,我找到了一个简单的解决方案
SendKeys.Send(“{F1}”)
这就解决了我的问题。但奇怪的是,实际上F2是正确的键,但它不起作用。只有F1有效。经过努力,我找到了一个简单的解决方案 SendKeys.Send(“{F1}”) 这就解决了我的问题。但奇怪的是,实际上F2是正确的键,但它不起作用。只有F1有效。SendKeys.Send(“{F1}”)方法对我不起作用。我认为现在发生的是,我们试图激活一个认为它已经被激活的窗口,除了它没有被完全激活 因此,我们需要激活另一个窗口以确保Excel被正确停用,然后重新激活Excel。但是,我们不希望用户看到任何闪烁或奇怪的东西。对我有效的方法是:
公共静态外部int GetDesktopWindow() [DllImport(“user32.dll”,CharSet=CharSet.Auto)] 私有静态外部bool setforegroundindow(IntPtr hWnd) SendKeys.Send(“{F1}”)方法对我不起作用。我认为现在发生的是,我们试图激活一个认为它已经被激活的窗口,除了它没有被完全激活 因此,我们需要激活另一个窗口以确保Excel被正确停用,然后重新激活Excel。但是,我们不希望用户看到任何闪烁或奇怪的东西。对我有效的方法是:
公共静态外部int GetDesktopWindow() [DllImport(“user32.dll”,CharSet=CharSet.Auto)] 私有静态外部bool setforegroundindow(IntPtr hWnd)
对于使用外接程序Express创建Excel外接程序的任何人,您可以使用
ADXKeyFilter
事件,并将默认处理程序参数的操作
属性设置为ADXKeyFilterAction.SendToHostApplication
,对于使用外接程序Express创建Excel外接程序的任何人,您可以使用ADXKeyFilter
事件,并将默认处理程序参数的Action
属性设置为ADXKeyFilterAction.SendToHostApplication
+1,感谢您的提示。我也有同样的问题。我认为一些windows窗体控件以某种方式保持键盘焦点,但我不知道为什么…+1,谢谢你的提示。我也有同样的问题。我认为一些windows窗体控件以某种方式保持键盘焦点,但我不知道为什么…我认为GetDesktopWindow()的声明应该是:[DllImport(“user32.dll”,SetLastError=false)]static extern IntPtr GetDesktopWindow();如果您还没有excelHandle
变量,则需要使用new IntPtr(Globals.ThisAddIn.Application.Hwnd)
。人们从哪里知道这个DllImport魔术呢?我认为GetDesktopWindow()的声明应该是:[DllImport(“user32.dll”,SetLastError=false)]静态外部IntPtr GetDesktopWindow();如果您还没有excelHandle
变量,则需要使用new IntPtr(Globals.ThisAddIn.Application.Hwnd)
。人们从哪里知道德林波特魔法?
SetForegroundWindow(GetDesktopWindow());
SetForegroundWindow(excelHandle);