Integrated PowerPoint support

This commit is contained in:
XY Wang 2021-09-12 13:18:10 +08:00
parent 941525025e
commit a3ddb4d9e6
3 changed files with 220 additions and 34 deletions

View File

@ -102,6 +102,9 @@
<PackageReference Include="ModernWpfUI">
<Version>0.9.4</Version>
</PackageReference>
<PackageReference Include="Newtonsoft.Json">
<Version>13.0.1</Version>
</PackageReference>
</ItemGroup>
<ItemGroup>
<COMReference Include="Microsoft.Office.Core">

View File

@ -46,15 +46,15 @@
<Button Name="BtnExit" Content="退出" FontFamily="Microsoft YaHei UI"
Margin="0,0,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"
Click="BtnExit_Click" Foreground="Black" Background="#7F909090"/>
<TextBlock Text="自动&#x000A;粗细" Margin="0,10,0,0"
<TextBlock Text="自动&#x000A;粗细" Visibility="Collapsed" Margin="0,10,0,0"
FontSize="14" HorizontalAlignment="Center"
Foreground="{Binding ElementName=BtnExit, Path=Foreground}"/>
<Viewbox Height="30">
<Viewbox Height="30" Visibility="Collapsed">
<ui:ToggleSwitch Name="ToggleSwitchAutoWeight" Header="" Width="40.5"
FontFamily="Microsoft YaHei UI" FontSize="19"
OnContent="" OffContent="" Toggled="ToggleSwitchAutoWeight_Toggled"/>
</Viewbox>
<TextBlock Text="老魏&#x000A;模式" Margin="0,5,0,0"
<TextBlock Text="老魏&#x000A;模式" Margin="0,10,0,0"
FontSize="14" HorizontalAlignment="Center"
Foreground="{Binding ElementName=BtnExit, Path=Foreground}"/>
<Viewbox Height="30">
@ -65,7 +65,7 @@
<Button Name="BtnThickness" Content="粗细" Visibility="Collapsed" FontFamily="Microsoft YaHei UI"
Margin="0,10,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"
Click="BtnThickness_Click" Foreground="{Binding ElementName=BtnExit, Path=Foreground}" Background="#7F909090"/>
<Button Name="BtnErase" Content="橡皮" FontFamily="Microsoft YaHei UI"
<Button Name="BtnErase" Content="橡皮" Visibility="Collapsed" FontFamily="Microsoft YaHei UI"
Margin="0,10,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"
Click="BtnErase_Click" Foreground="{Binding ElementName=BtnExit, Path=Foreground}" Background="#7F909090"/>
<Button Name="BtnSwitchTheme" Content="深色" FontFamily="Microsoft YaHei UI"
@ -100,6 +100,12 @@
<Button x:Name="BtnCheckPPT" Visibility="Collapsed" Content="检查" FontFamily="Microsoft YaHei UI"
Margin="0,10,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"
Click="BtnCheckPPT_Click" Foreground="{Binding ElementName=BtnExit, Path=Foreground}" Background="#7F909090"/>
<Button x:Name="BtnPPTSlideShow" Visibility="Collapsed" Content="从头&#x000A;放映" FontFamily="Microsoft YaHei UI"
Margin="0,10,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"
Click="BtnPPTSlideShow_Click" Foreground="{Binding ElementName=BtnExit, Path=Foreground}" Background="#7F909090"/>
<Button x:Name="BtnPPTSlideShowEnd" Visibility="Collapsed" Content="结束&#x000A;放映" FontFamily="Microsoft YaHei UI"
Margin="0,10,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"
Click="BtnPPTSlideShowEnd_Click" Foreground="{Binding ElementName=BtnExit, Path=Foreground}" Background="#7F909090"/>
<StackPanel Name="StackPanelPPTControls" Visibility="Collapsed">
<Button x:Name="BtnPPTSlidesUp" Content="↑" FontFamily="Microsoft YaHei UI"
Margin="0,10,0,0" Width="{Binding ElementName=StackPanelMain, Path=ActualWidth}"

View File

@ -16,6 +16,10 @@ using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Office.Interop.PowerPoint;
using System.Runtime.InteropServices;
using Application = System.Windows.Application;
using System.Timers;
using System.Threading;
using Timer = System.Timers.Timer;
namespace Ink_Canvas
{
@ -27,8 +31,14 @@ namespace Ink_Canvas
public MainWindow()
{
InitializeComponent();
timerCheckPPT.Elapsed += TimerCheckPPT_Elapsed;
timerCheckPPT.Interval = 1000;
timerCheckPPT.Start();
}
Timer timerCheckPPT = new Timer();
private void Button_Click(object sender, RoutedEventArgs e)
{
Close();
@ -170,6 +180,8 @@ namespace Ink_Canvas
//}
loadPenCanvas();
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
private void back_HotKey(object sender, ExecutedRoutedEventArgs e)
@ -183,20 +195,20 @@ namespace Ink_Canvas
private void KeyExit(object sender, ExecutedRoutedEventArgs e)
{
if (isInkCanvasVisible)
{
Main_Grid.Visibility = Visibility.Hidden;
isInkCanvasVisible = false;
//inkCanvas.Strokes.Clear();
WindowState = WindowState.Minimized;
}
else
{
Main_Grid.Visibility = Visibility.Visible;
isInkCanvasVisible = true;
inkCanvas.Strokes.Clear();
WindowState = WindowState.Maximized;
}
//if (isInkCanvasVisible)
//{
// Main_Grid.Visibility = Visibility.Hidden;
// isInkCanvasVisible = false;
// //inkCanvas.Strokes.Clear();
// WindowState = WindowState.Minimized;
//}
//else
//{
// Main_Grid.Visibility = Visibility.Visible;
// isInkCanvasVisible = true;
// inkCanvas.Strokes.Clear();
// WindowState = WindowState.Maximized;
//}
}
private void Window_KeyDown(object sender, KeyEventArgs e)
@ -243,6 +255,8 @@ namespace Ink_Canvas
}
}
#region Buttons - Color
int inkColor = 0;
private void ColorSwitchCheck()
@ -262,7 +276,7 @@ namespace Ink_Canvas
{
inkColor = 0;
forceEraser = false;
if (currentMode == 2)
if (BtnSwitchTheme.Content.ToString() == "浅色")
{
inkCanvas.DefaultDrawingAttributes.Color = Colors.White;
}
@ -330,6 +344,8 @@ namespace Ink_Canvas
return b;
}
#endregion
int BoundsWidth = 6;
private void Main_Grid_TouchDown(object sender, TouchEventArgs e)
@ -458,19 +474,23 @@ namespace Ink_Canvas
int slidescount = 0;
private void BtnCheckPPT_Click(object sender, RoutedEventArgs e)
{
//try
//{
pptApplication = Marshal.GetActiveObject("PowerPoint.Application") as Microsoft.Office.Interop.PowerPoint.Application;
try
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
//pptApplication.SlideShowWindows[1].View.Next();
if (pptApplication != null)
{
//获得演示文稿对象
presentation = pptApplication.ActivePresentation;
pptApplication.SlideShowBegin += PptApplication_SlideShowBegin;
pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide;
pptApplication.SlideShowEnd += PptApplication_SlideShowEnd;
// 获得幻灯片对象集合
slides = presentation.Slides;
// 获得幻灯片的数量
slidescount = slides.Count;
memoryStreams = new MemoryStream[slidescount + 2];
// 获得当前选中的幻灯片
try
{
@ -486,39 +506,172 @@ namespace Ink_Canvas
}
if (pptApplication == null) throw new Exception();
//BtnCheckPPT.Visibility = Visibility.Collapsed;
StackPanelPPTControls.Visibility = Visibility.Visible;
//}
//catch
//{
// StackPanelPPTControls.Visibility = Visibility.Collapsed;
// MessageBox.Show("未找到幻灯片");
//}
}
catch
{
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
MessageBox.Show("未找到幻灯片");
}
}
private void TimerCheckPPT_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Marshal.GetActiveObject("PowerPoint.Application");
if (pptApplication != null)
{
timerCheckPPT.Stop();
//获得演示文稿对象
presentation = pptApplication.ActivePresentation;
pptApplication.PresentationClose += PptApplication_PresentationClose;
pptApplication.SlideShowBegin += PptApplication_SlideShowBegin;
pptApplication.SlideShowNextSlide += PptApplication_SlideShowNextSlide;
pptApplication.SlideShowEnd += PptApplication_SlideShowEnd;
// 获得幻灯片对象集合
slides = presentation.Slides;
// 获得幻灯片的数量
slidescount = slides.Count;
memoryStreams = new MemoryStream[slidescount + 2];
// 获得当前选中的幻灯片
try
{
// 在普通视图下这种方式可以获得当前选中的幻灯片对象
// 然而在阅读模式下,这种方式会出现异常
slide = slides[pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber];
}
catch
{
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication.SlideShowWindows[1].View.Slide;
}
}
if (pptApplication == null) throw new Exception();
//BtnCheckPPT.Visibility = Visibility.Collapsed;
Application.Current.Dispatcher.Invoke(() =>
{
BtnPPTSlideShow.Visibility = Visibility.Visible;
});
}
catch
{
//StackPanelPPTControls.Visibility = Visibility.Collapsed;
Application.Current.Dispatcher.Invoke(() =>
{
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
});
timerCheckPPT.Start();
}
}
private void PptApplication_PresentationClose(Presentation Pres)
{
timerCheckPPT.Start();
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed;
}
private void PptApplication_SlideShowBegin(SlideShowWindow Wn)
{
Application.Current.Dispatcher.Invoke(() =>
{
StackPanelPPTControls.Visibility = Visibility.Visible;
BtnPPTSlideShow.Visibility = Visibility.Collapsed;
BtnPPTSlideShowEnd.Visibility = Visibility.Visible;
StackPanelMain.Margin = new Thickness(10, 0, 10, 10);
});
previousSlideID = Wn.View.CurrentShowPosition;
}
private void PptApplication_SlideShowEnd(Presentation Pres)
{
Application.Current.Dispatcher.Invoke(() =>
{
BtnPPTSlideShow.Visibility = Visibility.Visible;
BtnPPTSlideShowEnd.Visibility = Visibility.Collapsed;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
StackPanelMain.Margin = new Thickness(10, 0, 10, 55);
inkCanvas.Strokes.Clear();
if (Main_Grid.Background != Brushes.Transparent)
{
BtnHideInkCanvas_Click(BtnHideInkCanvas, null);
}
});
}
int previousSlideID = 0;
MemoryStream[] memoryStreams = new MemoryStream[50];
private void PptApplication_SlideShowNextSlide(SlideShowWindow Wn)
{
if (Wn.View.CurrentShowPosition != previousSlideID)
{
Application.Current.Dispatcher.Invoke(() =>
{
MemoryStream ms = new MemoryStream();
inkCanvas.Strokes.Save(ms);
ms.Position = 0;
memoryStreams[previousSlideID] = ms;
inkCanvas.Strokes.Clear();
try
{
if (memoryStreams[Wn.View.CurrentShowPosition].Length > 0)
{
inkCanvas.Strokes = new System.Windows.Ink.StrokeCollection(memoryStreams[Wn.View.CurrentShowPosition]);
}
}
catch (Exception ex)
{ }
});
previousSlideID = Wn.View.CurrentShowPosition;
}
}
private void BtnPPTSlidesUp_Click(object sender, RoutedEventArgs e)
{
if (currentMode == 1)
{
GridBackgroundCover.Visibility = Visibility.Hidden;
currentMode = 0;
}
try
{
slides[5].Select();
slide = slides[5];
pptApplication.SlideShowWindows[0].View.Previous();
pptApplication.SlideShowWindows[1].View.Application.SlideShowWindows[1].Activate();
pptApplication.SlideShowWindows[1].View.Previous();
}
catch
{
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
}
}
private void BtnPPTSlidesDown_Click(object sender, RoutedEventArgs e)
{
if (currentMode == 1)
{
GridBackgroundCover.Visibility = Visibility.Hidden;
currentMode = 0;
}
try
{
pptApplication.SlideShowWindows[0].View.Next();
pptApplication.SlideShowWindows[1].View.Application.SlideShowWindows[1].Activate();
pptApplication.SlideShowWindows[1].View.Next();
}
catch (Exception ex)
{
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls.Visibility = Visibility.Collapsed;
MessageBox.Show(ex.ToString());
//MessageBox.Show(ex.ToString());
}
}
@ -526,6 +679,30 @@ namespace Ink_Canvas
{
}
private void BtnPPTSlideShow_Click(object sender, RoutedEventArgs e)
{
try
{
new Thread(new ThreadStart(() => {
//presentation.SlideShowSettings.StartingSlide = 1;// pptApplication.ActiveWindow.Selection.SlideRange.SlideNumber;
//presentation.SlideShowSettings.EndingSlide = 1;
presentation.SlideShowSettings.Run();
})).Start();
}
catch { }
}
private void BtnPPTSlideShowEnd_Click(object sender, RoutedEventArgs e)
{
new Thread(new ThreadStart(() => {
try
{
pptApplication.SlideShowWindows[1].View.Exit();
}
catch { }
})).Start();
}
}
enum HotkeyModifiers