it-roy-ru.com

Excel в качестве инкрустации в WPF отключил ExcelWorksheet

Я нашел решение для настройки экземпляра Excel в WPF с помощью функции SetParent () Windows.

Проблема в том, что мышь и клавиатура реагируют не на лист, а на рабочую книгу.

Полный образец Скачать проект здесь

Я также пытался с WindowsFormsHost , но это имеет тот же эффект.

XAML

<Window x:Class="ExcelEditor.SimpleWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.Microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:ExcelEditor"
    mc:Ignorable="d" Loaded="Window_Loaded" Closing="Window_Closing"
    Title="SimpleWindow" Height="450" Width="800">
<Grid x:Name="LayoutRoot">

</Grid>

Код C #

    using System;
    using System.Windows;


namespace ExcelEditor
{
    /// <summary>
    /// Interaktionslogik für SimpleWindow.xaml
    /// </summary>
    public partial class SimpleWindow : Window
    {
        private Microsoft.Office.Interop.Excel.Application ExcelApplication;

        public SimpleWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(this); // <- testing only (no success)
            ExcelApplication = new Microsoft.Office.Interop.Excel.Application();
            ExcelApplication.DisplayAlerts = false;
            System.Windows.Interop.HwndSource hwnd = (System.Windows.Interop.HwndSource)System.Windows.Interop.HwndSource.FromVisual(this.LayoutRoot);
            var excelWnd = Microsoft.Win32.Interop.FindWindow("XLMAIN", null);
            GenerateTestData(ExcelApplication);
            var successOfParentSetup = Microsoft.Win32.Interop.SetParent(excelWnd, hwnd.Handle);
            var isMovedToLeftTop = Microsoft.Win32.Interop.MoveWindow(excelWnd, 10, 10, 800, 600, true);
            ExcelApplication.Visible = true;
        }

        private void GenerateTestData(Microsoft.Office.Interop.Excel.Application excelApplication)
        {
            var excelWorkbook = excelApplication.Workbooks.Add();
            var excelWorksheet = excelWorkbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
            excelWorksheet.Cells[1, 1] = "Today";
            excelWorksheet.Cells[2, 1] = DateTime.Now.ToString();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (ExcelApplication != null)
            {
                ExcelApplication.ActiveWorkbook.Close();
                ExcelApplication.Visible = false;
                ExcelApplication.Quit();
                ExcelApplication = null;
            }
        }
    }
}

Api звонки

    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern bool SetWindowPos(
        IntPtr hWnd,               // handle to window
        IntPtr hWndInsertAfter,    // placement-order handle
        int X,                  // horizontal position
        int Y,                  // vertical position
        int cx,                 // width
        int cy,                 // height
        uint uFlags             // window-positioning options
    );

    [DllImport("user32.dll", EntryPoint = "MoveWindow")]
    public static extern bool MoveWindow(
        IntPtr hWnd,
        int X,
        int Y,
        int nWidth,
        int nHeight,
        bool bRepaint
    );
    [DllImport("USER32.DLL", SetLastError = true)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    //Sets a window to be a child window of another window
    [DllImport("USER32.DLL", SetLastError = true)]
    public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

Вопрос в том, как включить обработку мыши и клавиатуры в Excel, чтобы разрешить редактирование рабочего листа?

Excel not working propert as parent

* Протестировано в: Windows 10 x64, один экран (дополнительный двойной экран), Excel 2016, MSO 32-Bit (16.0.10325.20082) вне Office 365

Об этой проблеме также сообщается на Microsoft Forum , чтобы проверить, есть ли решение.

В следующем видео вы видите, как щелчок иногда выделяет ячейки, а иногда он не распознает мышь.

Excel

14
Nasenbaer

Вы должны убедиться, что Excel был показан один раз, прежде чем вы сможете вызвать SetParent. Конечно, это выглядит некрасиво, поэтому вам также нужно как-то скрыть пользовательский интерфейс Excel от конечного пользователя. Например:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        ...
        // get Excel window
        var excelWnd = Microsoft.Win32.Interop.FindWindow("XLMAIN", null);

        // move Excel somewhere outside the screen (of course you should compute it, not hardcode it)
        Microsoft.Win32.Interop.MoveWindow(excelWnd, -10000, -10000, 800, 600, true);

        // show it so it's initialized properly
        ExcelApplication.Visible = true;
        GenerateTestData(ExcelApplication);

        // now call SetParent
        Microsoft.Win32.Interop.SetParent(excelWnd, hwnd.Handle);

        // move it to parent
        Microsoft.Win32.Interop.MoveWindow(excelWnd, 10, 10, 800, 600, true);
    }
1
Simon Mourier