如何防止 Excel 在使用 SetParent 嵌入时失去焦点?

问题描述 投票:0回答:1

我正在尝试将 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 应用程序实例。当工作簿打开时我真的无法做到这一点。

c# excel wpf interop
1个回答
-7
投票

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;

必须彻底测试这些方法,以确保它们在您的特定场景中按预期工作。此外,请考虑覆盖焦点行为的影响,因为它可能会影响用户体验和可访问性。

© www.soinside.com 2019 - 2024. All rights reserved.