Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel加载项焦点未返回到活动工作表_Excel_Focus_Add In_Cell - Fatal编程技术网

Excel加载项焦点未返回到活动工作表

Excel加载项焦点未返回到活动工作表,excel,focus,add-in,cell,Excel,Focus,Add In,Cell,我在c#中开发了一个excel加载项(VSTO),其中有一个带有树状视图的任务窗格。单击树视图时,它会将一些数据加载到excel工作表中。但加载后,焦点仍保留在树状视图上,因此我无法在单元格中直接键入而不单击工作表。我需要在单击树状视图填充工作表后立即将焦点转移到活动工作表。我尝试了以下方法,但没有成功 ActiveSheet.Select() ActiveSheet.Activate() 我也试着设置范围。 另一件事是,当我向ActiveSheet.Activate()添加断点时,它会在到达

我在c#中开发了一个excel加载项(VSTO),其中有一个带有树状视图的任务窗格。单击树视图时,它会将一些数据加载到excel工作表中。但加载后,焦点仍保留在树状视图上,因此我无法在单元格中直接键入而不单击工作表。我需要在单击树状视图填充工作表后立即将焦点转移到活动工作表。我尝试了以下方法,但没有成功

ActiveSheet.Select()
ActiveSheet.Activate()
我也试着设置范围。
另一件事是,当我向
ActiveSheet.Activate()
添加断点时,它会在到达断点后工作,但如果没有断点,它仍会将焦点放在任务窗格上。

经过努力,我找到了一个简单的解决方案

SendKeys.Send(“{F1}”)


这就解决了我的问题。但奇怪的是,实际上F2是正确的键,但它不起作用。只有F1有效。

经过努力,我找到了一个简单的解决方案

SendKeys.Send(“{F1}”)

这就解决了我的问题。但奇怪的是,实际上F2是正确的键,但它不起作用。只有F1有效。

SendKeys.Send(“{F1}”)方法对我不起作用。我认为现在发生的是,我们试图激活一个认为它已经被激活的窗口,除了它没有被完全激活

因此,我们需要激活另一个窗口以确保Excel被正确停用,然后重新激活Excel。但是,我们不希望用户看到任何闪烁或奇怪的东西。对我有效的方法是:

  • 获取桌面的句柄
  • 在桌面句柄上调用SetForegroundWindow
  • 在主Excel句柄上调用SetForegroundWindow
  • [DllImport(“user32.dll”)]
    公共静态外部int GetDesktopWindow()

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

    私有静态外部bool setforegroundindow(IntPtr hWnd)

    SendKeys.Send(“{F1}”)方法对我不起作用。我认为现在发生的是,我们试图激活一个认为它已经被激活的窗口,除了它没有被完全激活

    因此,我们需要激活另一个窗口以确保Excel被正确停用,然后重新激活Excel。但是,我们不希望用户看到任何闪烁或奇怪的东西。对我有效的方法是:

  • 获取桌面的句柄
  • 在桌面句柄上调用SetForegroundWindow
  • 在主Excel句柄上调用SetForegroundWindow
  • [DllImport(“user32.dll”)]
    公共静态外部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);