Я нашел решение для установки экземпляра 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>
Код С#
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;
}
}
}
}
Апи звонки
[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, чтобы разрешить редактирование рабочего листа?
* Проверено на: Windows 10 x64, Single screen (дополнительный двухэкранный) Excel 2016 MSO 32-бит (16.0.10325.20082) из Office 365
Эта проблема также сообщается на форуме Microsoft, чтобы проверить, есть ли решение.
В следующем видео вы видите, как клик иногда выбирает ячейки, и иногда он не распознает мышь.