我正在尝试将 Excel 嵌入到 WPF 应用程序中。
我已经拥有了工作所需的所有内容,除了现在我试图允许 .xlsm 文件。单击 ActiveX 控件时,Excel 似乎失去焦点,我无法再单击工作簿中的任何内容。
我仍然可以单击 Excel 应用程序 UI,例如选项卡等。我怎样才能防止这种焦点变化,或者怎样才能恢复它?
这是我当前打开 Excel 时正在执行的操作的一个小示例:
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
if (excelApp == null) return;
if (!(windowsFormsHost1.Child is Panel panel))
{
panel = new Panel();
windowsFormsHost1.Child = panel;
}
excelHandle = new IntPtr(excelApp.Hwnd);
SetParent(excelHandle, panel.Handle);
SetForegroundWindow(excelHandle);
SetFocus(excelHandle);
我没有尝试过改变太多,因为我不确定从那里该去哪里。我尝试添加代码以将 Excel 重新聚焦在计时器上,但它无法解决任何问题。
我最初打开新工作簿时也遇到了这个问题,我无法单击任何单元格或任何内容,并且每次打开工作簿时都必须创建一个新的 Excel 应用程序实例。当工作簿打开时我真的无法做到这一点。
Excel 失去焦点是很常见的,因为它不再是顶级窗口。这可能会令人沮丧,特别是如果您希望保持用户与嵌入的 Excel 实例的交互而不失去焦点。
SetForegroundWindow:使用
SetParent
设置父窗口后,可以调用SetForegroundWindow
将Excel窗口置于前台。这有助于保持对 Excel 窗口的关注。
SetParent(hWndExcel, hWndParent); // Assuming hWndExcel is the handle to Excel window and hWndParent is the handle to the parent window.
SetForegroundWindow(hWndExcel);
捕获焦点事件:您可以捕获父窗口上的焦点事件并将其重定向到嵌入的 Excel 窗口。例如,您可以处理
WM_SETFOCUS
消息,并在父窗口接收焦点时将焦点设置到 Excel 窗口。
case WM_SETFOCUS:
SetFocus(hWndExcel); // Assuming hWndExcel is the handle to Excel window
break;
必须彻底测试这些方法,以确保它们在您的特定场景中按预期工作。此外,请考虑覆盖焦点行为的影响,因为它可能会影响用户体验和可访问性。