2024-05-01 18:23:32 +08:00
using Ink_Canvas.Helpers ;
using Microsoft.Office.Interop.PowerPoint ;
2024-05-11 01:35:32 +08:00
using iNKORE.UI.WPF.Helpers ;
2024-05-01 18:23:32 +08:00
using System ;
using System.Diagnostics ;
using System.IO ;
using System.Runtime.InteropServices ;
using System.Threading ;
using System.Threading.Tasks ;
using System.Timers ;
using System.Windows ;
using System.Windows.Ink ;
using System.Windows.Input ;
using System.Windows.Media ;
using System.Windows.Threading ;
using Application = System . Windows . Application ;
using File = System . IO . File ;
using MessageBox = System . Windows . MessageBox ;
2024-05-11 01:35:32 +08:00
using iNKORE.UI.WPF.Modern ;
2024-05-01 18:23:32 +08:00
namespace Ink_Canvas {
public partial class MainWindow : Window {
public static Microsoft . Office . Interop . PowerPoint . Application pptApplication = null ;
2024-06-05 20:25:26 +08:00
public static Presentation presentation = null ;
public static Slides slides = null ;
public static Slide slide = null ;
2024-05-01 18:23:32 +08:00
public static int slidescount = 0 ;
private void BtnCheckPPT_Click ( object sender , RoutedEventArgs e ) {
try {
2024-06-05 20:25:26 +08:00
pptApplication =
( Microsoft . Office . Interop . PowerPoint . Application ) Marshal . GetActiveObject ( "PowerPoint.Application" ) ;
2024-05-01 18:23:32 +08:00
//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 {
// 在普通视图下这种方式可以获得当前选中的幻灯片对象
// 然而在阅读模式下,这种方式会出现异常
slide = slides [ pptApplication . ActiveWindow . Selection . SlideRange . SlideNumber ] ;
2024-06-05 20:25:26 +08:00
}
catch {
2024-05-01 18:23:32 +08:00
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication . SlideShowWindows [ 1 ] . View . Slide ;
}
}
if ( pptApplication = = null ) throw new Exception ( ) ;
//BtnCheckPPT.Visibility = Visibility.Collapsed;
StackPanelPPTControls . Visibility = Visibility . Visible ;
2024-06-05 20:25:26 +08:00
}
catch {
2024-05-01 18:23:32 +08:00
//BtnCheckPPT.Visibility = Visibility.Visible;
StackPanelPPTControls . Visibility = Visibility . Collapsed ;
BottomViewboxPPTSidesControl . Visibility = Visibility . Collapsed ;
LeftSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
RightSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
MessageBox . Show ( "未找到幻灯片" ) ;
}
}
private void ToggleSwitchSupportWPS_Toggled ( object sender , RoutedEventArgs e ) {
if ( ! isLoaded ) return ;
Settings . PowerPointSettings . IsSupportWPS = ToggleSwitchSupportWPS . IsOn ;
SaveSettingsToFile ( ) ;
}
2024-06-05 20:25:26 +08:00
private static bool isWPSSupportOn = > Settings . PowerPointSettings . IsSupportWPS ;
2024-05-01 18:23:32 +08:00
public static bool IsShowingRestoreHiddenSlidesWindow = false ;
2024-06-05 20:25:26 +08:00
private static bool IsShowingAutoplaySlidesWindow = false ;
2024-05-01 18:23:32 +08:00
private void TimerCheckPPT_Elapsed ( object sender , ElapsedEventArgs e ) {
if ( IsShowingRestoreHiddenSlidesWindow ) return ;
try {
2024-06-05 20:25:26 +08:00
var processes = Process . GetProcessesByName ( "wpp" ) ;
if ( processes . Length > 0 & & ! isWPSSupportOn ) return ;
2024-05-01 18:23:32 +08:00
//使用下方提前创建 PowerPoint 实例,将导致 PowerPoint 不再有启动界面
//pptApplication = (Microsoft.Office.Interop.PowerPoint.Application)Activator.CreateInstance(Marshal.GetTypeFromCLSID(new Guid("91493441-5A91-11CF-8700-00AA0060263B")));
//new ComAwareEventInfo(typeof(EApplication_Event), "SlideShowBegin").AddEventHandler(pptApplication, new EApplication_SlideShowBeginEventHandler(this.PptApplication_SlideShowBegin));
//new ComAwareEventInfo(typeof(EApplication_Event), "SlideShowEnd").AddEventHandler(pptApplication, new EApplication_SlideShowEndEventHandler(this.PptApplication_SlideShowEnd));
//new ComAwareEventInfo(typeof(EApplication_Event), "SlideShowNextSlide").AddEventHandler(pptApplication, new EApplication_SlideShowNextSlideEventHandler(this.PptApplication_SlideShowNextSlide));
//ConfigHelper.Instance.IsInitApplicationSuccessful = true;
2024-06-05 20:25:26 +08:00
pptApplication =
( Microsoft . Office . Interop . PowerPoint . Application ) Marshal . GetActiveObject ( "PowerPoint.Application" ) ;
2024-05-01 18:23:32 +08:00
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 ] ;
2024-06-05 20:25:26 +08:00
}
catch {
2024-05-01 18:23:32 +08:00
// 在阅读模式下出现异常时,通过下面的方式来获得当前选中的幻灯片对象
slide = pptApplication . SlideShowWindows [ 1 ] . View . Slide ;
}
}
if ( pptApplication = = null ) return ;
//BtnCheckPPT.Visibility = Visibility.Collapsed;
// 跳转到上次播放页
if ( Settings . PowerPointSettings . IsNotifyPreviousPage )
Application . Current . Dispatcher . BeginInvoke ( ( ) = > {
2024-06-05 20:25:26 +08:00
var folderPath = Settings . Automation . AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + presentation . Name + "_" +
presentation . Slides . Count ;
2024-05-01 18:23:32 +08:00
try {
2024-06-05 20:25:26 +08:00
if ( ! File . Exists ( folderPath + "/Position" ) ) return ;
if ( ! int . TryParse ( File . ReadAllText ( folderPath + "/Position" ) , out var page ) ) return ;
if ( page < = 0 ) return ;
new YesOrNoNotificationWindow ( $"上次播放到了第 {page} 页, 是否立即跳转" , ( ) = > {
if ( pptApplication . SlideShowWindows . Count > = 1 )
// 如果已经播放了的话, 跳转
presentation . SlideShowWindow . View . GotoSlide ( page ) ;
else
presentation . Windows [ 1 ] . View . GotoSlide ( page ) ;
} ) . ShowDialog ( ) ;
}
catch ( Exception ex ) {
2024-05-01 18:23:32 +08:00
LogHelper . WriteLogToFile ( ex . ToString ( ) , LogHelper . LogType . Error ) ;
}
} , DispatcherPriority . Normal ) ;
//检查是否有隐藏幻灯片
if ( Settings . PowerPointSettings . IsNotifyHiddenPage ) {
2024-06-05 20:25:26 +08:00
var isHaveHiddenSlide = false ;
foreach ( Slide slide in slides )
2024-05-01 18:23:32 +08:00
if ( slide . SlideShowTransition . Hidden = = Microsoft . Office . Core . MsoTriState . msoTrue ) {
isHaveHiddenSlide = true ;
break ;
}
Application . Current . Dispatcher . BeginInvoke ( ( ) = > {
if ( isHaveHiddenSlide & & ! IsShowingRestoreHiddenSlidesWindow ) {
IsShowingRestoreHiddenSlidesWindow = true ;
new YesOrNoNotificationWindow ( "检测到此演示文档中包含隐藏的幻灯片,是否取消隐藏?" ,
( ) = > {
2024-06-05 20:25:26 +08:00
foreach ( Slide slide in slides )
2024-05-01 18:23:32 +08:00
if ( slide . SlideShowTransition . Hidden = =
2024-06-05 20:25:26 +08:00
Microsoft . Office . Core . MsoTriState . msoTrue )
2024-05-01 18:23:32 +08:00
slide . SlideShowTransition . Hidden =
Microsoft . Office . Core . MsoTriState . msoFalse ;
} ) . ShowDialog ( ) ;
}
BtnPPTSlideShow . Visibility = Visibility . Visible ;
} , DispatcherPriority . Normal ) ;
}
2024-05-04 17:41:34 +08:00
//检测是否有自动播放
if ( Settings . PowerPointSettings . IsNotifyAutoPlayPresentation )
Application . Current . Dispatcher . BeginInvoke ( ( ) = > {
2024-06-05 20:25:26 +08:00
var isHaveAutoPlaySettings = false ;
isHaveAutoPlaySettings = presentation . SlideShowSettings . AdvanceMode ! =
PpSlideShowAdvanceMode . ppSlideShowManualAdvance ;
if ( isHaveAutoPlaySettings & & ! IsShowingAutoplaySlidesWindow ) {
2024-05-04 17:41:34 +08:00
IsShowingAutoplaySlidesWindow = true ;
new YesOrNoNotificationWindow ( "检测到此演示文档中有自动播放或排练计时已经启用,是否取消?" ,
( ) = > {
2024-06-05 20:25:26 +08:00
presentation . SlideShowSettings . AdvanceMode =
PpSlideShowAdvanceMode . ppSlideShowManualAdvance ;
2024-05-04 17:41:34 +08:00
} ) . ShowDialog ( ) ;
}
BtnPPTSlideShow . Visibility = Visibility . Visible ;
} , DispatcherPriority . Normal ) ;
2024-06-05 20:25:26 +08:00
2024-05-04 17:41:34 +08:00
2024-05-01 18:23:32 +08:00
//如果检测到已经开始放映,则立即进入画板模式
2024-06-05 20:25:26 +08:00
if ( pptApplication . SlideShowWindows . Count > = 1 )
2024-05-01 18:23:32 +08:00
PptApplication_SlideShowBegin ( pptApplication . SlideShowWindows [ 1 ] ) ;
2024-06-05 20:25:26 +08:00
}
catch {
2024-05-01 18:23:32 +08:00
//StackPanelPPTControls.Visibility = Visibility.Collapsed;
2024-06-05 20:25:26 +08:00
Application . Current . Dispatcher . Invoke ( ( ) = > { BtnPPTSlideShow . Visibility = Visibility . Collapsed ; } ) ;
2024-05-01 18:23:32 +08:00
timerCheckPPT . Start ( ) ;
}
}
private void PptApplication_PresentationClose ( Presentation Pres ) {
pptApplication . PresentationClose - = PptApplication_PresentationClose ;
pptApplication . SlideShowBegin - = PptApplication_SlideShowBegin ;
pptApplication . SlideShowNextSlide - = PptApplication_SlideShowNextSlide ;
pptApplication . SlideShowEnd - = PptApplication_SlideShowEnd ;
pptApplication = null ;
timerCheckPPT . Start ( ) ;
Application . Current . Dispatcher . Invoke ( ( ) = > {
BtnPPTSlideShow . Visibility = Visibility . Collapsed ;
BtnPPTSlideShowEnd . Visibility = Visibility . Collapsed ;
} ) ;
}
2024-06-05 20:25:26 +08:00
private bool isPresentationHaveBlackSpace = false ;
2024-05-01 18:23:32 +08:00
private string pptName = null ;
2024-06-05 20:25:26 +08:00
2024-05-01 18:23:32 +08:00
private void PptApplication_SlideShowBegin ( SlideShowWindow Wn ) {
2024-06-05 20:25:26 +08:00
if ( Settings . Automation . IsAutoFoldInPPTSlideShow & & ! isFloatingBarFolded )
2024-05-01 18:23:32 +08:00
FoldFloatingBar_MouseUp ( null , null ) ;
2024-06-05 20:25:26 +08:00
else if ( isFloatingBarFolded ) UnFoldFloatingBar_MouseUp ( null , null ) ;
2024-05-01 18:23:32 +08:00
LogHelper . WriteLogToFile ( "PowerPoint Application Slide Show Begin" , LogHelper . LogType . Event ) ;
Application . Current . Dispatcher . Invoke ( ( ) = > {
2024-06-05 20:25:26 +08:00
if ( currentMode ! = 0 ) ImageBlackboard_MouseUp ( null , null ) ;
2024-05-01 18:23:32 +08:00
//调整颜色
2024-06-05 20:25:26 +08:00
var screenRatio = SystemParameters . PrimaryScreenWidth / SystemParameters . PrimaryScreenHeight ;
2024-05-01 18:23:32 +08:00
if ( Math . Abs ( screenRatio - 16.0 / 9 ) < = - 0.01 ) {
if ( Wn . Presentation . PageSetup . SlideWidth / Wn . Presentation . PageSetup . SlideHeight < 1.65 ) {
isPresentationHaveBlackSpace = true ;
//isButtonBackgroundTransparent = ToggleSwitchTransparentButtonBackground.IsOn;
if ( BtnSwitchTheme . Content . ToString ( ) = = "深色" ) {
//Light
BtnExit . Foreground = Brushes . White ;
//SymbolIconBtnColorBlackContent.Foreground = Brushes.White;
ThemeManager . Current . ApplicationTheme = ApplicationTheme . Dark ;
//BtnExit.Background = new SolidColorBrush(StringToColor("#AACCCCCC"));
2024-06-05 20:25:26 +08:00
}
else {
2024-05-01 18:23:32 +08:00
//Dark
//BtnExit.Background = new SolidColorBrush(StringToColor("#AA555555"));
}
}
}
2024-06-05 20:25:26 +08:00
else if ( screenRatio = = - 256 / 135 ) { }
2024-05-01 18:23:32 +08:00
lastDesktopInkColor = 1 ;
slidescount = Wn . Presentation . Slides . Count ;
previousSlideID = 0 ;
memoryStreams = new MemoryStream [ slidescount + 2 ] ;
pptName = Wn . Presentation . Name ;
LogHelper . NewLog ( "Name: " + Wn . Presentation . Name ) ;
LogHelper . NewLog ( "Slides Count: " + slidescount . ToString ( ) ) ;
//检查是否有已有墨迹,并加载
2024-06-05 20:25:26 +08:00
if ( Settings . PowerPointSettings . IsAutoSaveStrokesInPowerPoint )
if ( Directory . Exists ( Settings . Automation . AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + Wn . Presentation . Name + "_" +
Wn . Presentation . Slides . Count ) ) {
2024-05-01 18:23:32 +08:00
LogHelper . WriteLogToFile ( "Found saved strokes" , LogHelper . LogType . Trace ) ;
2024-06-05 20:25:26 +08:00
var files = new DirectoryInfo ( Settings . Automation . AutoSavedStrokesLocation +
@"\Auto Saved - Presentations\" + Wn . Presentation . Name + "_" +
Wn . Presentation . Slides . Count ) . GetFiles ( ) ;
var count = 0 ;
foreach ( var file in files )
2024-05-01 18:23:32 +08:00
if ( file . Name ! = "Position" ) {
2024-06-05 20:25:26 +08:00
var i = - 1 ;
2024-05-01 18:23:32 +08:00
try {
2024-06-05 20:25:26 +08:00
i = int . Parse ( Path . GetFileNameWithoutExtension ( file . Name ) ) ;
2024-05-01 18:23:32 +08:00
memoryStreams [ i ] = new MemoryStream ( File . ReadAllBytes ( file . FullName ) ) ;
memoryStreams [ i ] . Position = 0 ;
count + + ;
2024-06-05 20:25:26 +08:00
}
catch ( Exception ex ) {
LogHelper . WriteLogToFile (
$"Failed to load strokes on Slide {i}\n{ex.ToString()}" ,
LogHelper . LogType . Error ) ;
2024-05-01 18:23:32 +08:00
}
}
2024-06-05 20:25:26 +08:00
LogHelper . WriteLogToFile ( $"Loaded {count.ToString()} saved strokes" ) ;
2024-05-01 18:23:32 +08:00
}
StackPanelPPTControls . Visibility = Visibility . Visible ;
2024-06-05 20:25:26 +08:00
if ( Settings . PowerPointSettings . IsShowBottomPPTNavigationPanel )
2024-05-01 18:23:32 +08:00
AnimationsHelper . ShowWithSlideFromBottomAndFade ( BottomViewboxPPTSidesControl ) ;
2024-06-05 20:25:26 +08:00
else
2024-05-01 18:23:32 +08:00
BottomViewboxPPTSidesControl . Visibility = Visibility . Collapsed ;
if ( Settings . PowerPointSettings . IsShowSidePPTNavigationPanel ) {
AnimationsHelper . ShowWithScaleFromLeft ( LeftSidePanelForPPTNavigation ) ;
AnimationsHelper . ShowWithScaleFromRight ( RightSidePanelForPPTNavigation ) ;
2024-06-05 20:25:26 +08:00
}
else {
2024-05-01 18:23:32 +08:00
LeftSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
RightSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
}
BtnPPTSlideShow . Visibility = Visibility . Collapsed ;
BtnPPTSlideShowEnd . Visibility = Visibility . Visible ;
ViewBoxStackPanelMain . Margin = new Thickness ( 10 , 10 , 10 , 10 ) ;
2024-06-05 20:25:26 +08:00
ViewboxFloatingBar . Opacity = Settings . Appearance . IsColorfulViewboxFloatingBar ? 0.8 : 0.5 ;
2024-05-01 18:23:32 +08:00
2024-06-05 20:25:26 +08:00
if ( Settings . PowerPointSettings . IsShowCanvasAtNewSlideShow & &
GridTransparencyFakeBackground . Background = = Brushes . Transparent ) {
2024-05-01 18:23:32 +08:00
if ( currentMode ! = 0 ) {
currentMode = 0 ;
GridBackgroundCover . Visibility = Visibility . Collapsed ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardLeftSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardCenterSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardRightSide ) ;
//SaveStrokes();
ClearStrokes ( true ) ;
2024-06-05 20:25:26 +08:00
BtnSwitch . Content = BtnSwitchTheme . Content . ToString ( ) = = "浅色" ? "黑板" : "白板" ;
2024-05-01 18:23:32 +08:00
StackPanelPPTButtons . Visibility = Visibility . Visible ;
}
2024-06-05 20:25:26 +08:00
2024-05-01 18:23:32 +08:00
BtnHideInkCanvas_Click ( BtnHideInkCanvas , null ) ;
}
ClearStrokes ( true ) ;
BorderFloatingBarMainControls . Visibility = Visibility . Visible ;
2024-06-05 20:25:26 +08:00
if ( Settings . PowerPointSettings . IsShowCanvasAtNewSlideShow )
2024-05-01 18:23:32 +08:00
BorderPenColorRed_MouseUp ( BorderPenColorRed , null ) ;
isEnteredSlideShowEndEvent = false ;
PptNavigationTextBlock . Text = $"{Wn.View.CurrentShowPosition}/{Wn.Presentation.Slides.Count}" ;
LogHelper . NewLog ( "PowerPoint Slide Show Loading process complete" ) ;
new Thread ( new ThreadStart ( ( ) = > {
Thread . Sleep ( 100 ) ;
2024-06-05 20:25:26 +08:00
Application . Current . Dispatcher . Invoke ( ( ) = > { ViewboxFloatingBarMarginAnimation ( 60 ) ; } ) ;
2024-05-01 18:23:32 +08:00
} ) ) . Start ( ) ;
} ) ;
}
2024-06-05 20:25:26 +08:00
private bool isEnteredSlideShowEndEvent = false ; //防止重复调用本函数导致墨迹保存失效
2024-05-01 18:23:32 +08:00
private async void PptApplication_SlideShowEnd ( Presentation Pres ) {
if ( isFloatingBarFolded ) UnFoldFloatingBar_MouseUp ( null , null ) ;
LogHelper . WriteLogToFile ( string . Format ( "PowerPoint Slide Show End" ) , LogHelper . LogType . Event ) ;
if ( isEnteredSlideShowEndEvent ) {
LogHelper . WriteLogToFile ( "Detected previous entrance, returning" ) ;
return ;
}
2024-06-05 20:25:26 +08:00
2024-05-01 18:23:32 +08:00
isEnteredSlideShowEndEvent = true ;
if ( Settings . PowerPointSettings . IsAutoSaveStrokesInPowerPoint ) {
2024-06-05 20:25:26 +08:00
var folderPath = Settings . Automation . AutoSavedStrokesLocation + @"\Auto Saved - Presentations\" +
Pres . Name + "_" + Pres . Slides . Count ;
if ( ! Directory . Exists ( folderPath ) ) Directory . CreateDirectory ( folderPath ) ;
2024-05-01 18:23:32 +08:00
try {
File . WriteAllText ( folderPath + "/Position" , previousSlideID . ToString ( ) ) ;
2024-06-05 20:25:26 +08:00
}
catch { }
for ( var i = 1 ; i < = Pres . Slides . Count ; i + + )
if ( memoryStreams [ i ] ! = null )
2024-05-01 18:23:32 +08:00
try {
if ( memoryStreams [ i ] . Length > 8 ) {
2024-06-05 20:25:26 +08:00
var srcBuf = new byte [ memoryStreams [ i ] . Length ] ;
var byteLength = memoryStreams [ i ] . Read ( srcBuf , 0 , srcBuf . Length ) ;
2024-05-01 18:23:32 +08:00
File . WriteAllBytes ( folderPath + @"\" + i . ToString ( "0000" ) + ".icstk" , srcBuf ) ;
2024-06-05 20:25:26 +08:00
LogHelper . WriteLogToFile ( string . Format (
"Saved strokes for Slide {0}, size={1}, byteLength={2}" , i . ToString ( ) ,
memoryStreams [ i ] . Length , byteLength ) ) ;
}
else {
2024-05-01 18:23:32 +08:00
File . Delete ( folderPath + @"\" + i . ToString ( "0000" ) + ".icstk" ) ;
}
2024-06-05 20:25:26 +08:00
}
catch ( Exception ex ) {
LogHelper . WriteLogToFile (
$"Failed to save strokes for Slide {i}\n{ex.ToString()}" ,
LogHelper . LogType . Error ) ;
2024-05-01 18:23:32 +08:00
File . Delete ( folderPath + @"\" + i . ToString ( "0000" ) + ".icstk" ) ;
}
}
Application . Current . Dispatcher . Invoke ( ( ) = > {
isPresentationHaveBlackSpace = false ;
if ( BtnSwitchTheme . Content . ToString ( ) = = "深色" ) {
//Light
BtnExit . Foreground = Brushes . Black ;
//SymbolIconBtnColorBlackContent.Foreground = Brushes.White;
ThemeManager . Current . ApplicationTheme = ApplicationTheme . Light ;
2024-06-05 20:25:26 +08:00
}
else {
2024-05-01 18:23:32 +08:00
//Dark
}
BtnPPTSlideShow . Visibility = Visibility . Visible ;
BtnPPTSlideShowEnd . Visibility = Visibility . Collapsed ;
StackPanelPPTControls . Visibility = Visibility . Collapsed ;
BottomViewboxPPTSidesControl . Visibility = Visibility . Collapsed ;
LeftSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
RightSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
ViewBoxStackPanelMain . Margin = new Thickness ( 10 , 10 , 10 , 55 ) ;
if ( currentMode ! = 0 ) {
currentMode = 0 ;
GridBackgroundCover . Visibility = Visibility . Collapsed ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardLeftSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardCenterSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardRightSide ) ;
//SaveStrokes();
ClearStrokes ( true ) ;
//RestoreStrokes(true);
2024-06-05 20:25:26 +08:00
BtnSwitch . Content = BtnSwitchTheme . Content . ToString ( ) = = "浅色" ? "黑板" : "白板" ;
2024-05-01 18:23:32 +08:00
StackPanelPPTButtons . Visibility = Visibility . Visible ;
}
ClearStrokes ( true ) ;
2024-06-05 20:25:26 +08:00
if ( GridTransparencyFakeBackground . Background ! = Brushes . Transparent )
2024-05-01 18:23:32 +08:00
BtnHideInkCanvas_Click ( BtnHideInkCanvas , null ) ;
2024-06-05 20:25:26 +08:00
if ( Settings . Appearance . IsColorfulViewboxFloatingBar )
2024-05-01 18:23:32 +08:00
ViewboxFloatingBar . Opacity = 0.95 ;
2024-06-05 20:25:26 +08:00
else
2024-05-01 18:23:32 +08:00
ViewboxFloatingBar . Opacity = 1 ;
} ) ;
await Task . Delay ( 150 ) ;
2024-06-05 20:25:26 +08:00
ViewboxFloatingBarMarginAnimation ( 100 , true ) ;
2024-05-01 18:23:32 +08:00
}
2024-06-05 20:25:26 +08:00
private int previousSlideID = 0 ;
private MemoryStream [ ] memoryStreams = new MemoryStream [ 50 ] ;
2024-05-01 18:23:32 +08:00
private void PptApplication_SlideShowNextSlide ( SlideShowWindow Wn ) {
2024-06-05 20:25:26 +08:00
LogHelper . WriteLogToFile ( $"PowerPoint Next Slide (Slide {Wn.View.CurrentShowPosition})" ,
LogHelper . LogType . Event ) ;
if ( Wn . View . CurrentShowPosition = = previousSlideID ) return ;
Application . Current . Dispatcher . Invoke ( ( ) = > {
var ms = new MemoryStream ( ) ;
inkCanvas . Strokes . Save ( ms ) ;
ms . Position = 0 ;
memoryStreams [ previousSlideID ] = ms ;
2024-05-01 18:23:32 +08:00
2024-06-05 20:25:26 +08:00
if ( inkCanvas . Strokes . Count > Settings . Automation . MinimumAutomationStrokeNumber & &
Settings . PowerPointSettings . IsAutoSaveScreenShotInPowerPoint & & ! _isPptClickingBtnTurned )
SaveScreenShot ( true , Wn . Presentation . Name + "/" + Wn . View . CurrentShowPosition ) ;
_isPptClickingBtnTurned = false ;
2024-05-01 18:23:32 +08:00
2024-06-05 20:25:26 +08:00
ClearStrokes ( true ) ;
timeMachine . ClearStrokeHistory ( ) ;
2024-05-01 18:23:32 +08:00
2024-06-05 20:25:26 +08:00
try {
if ( memoryStreams [ Wn . View . CurrentShowPosition ] ! = null & &
memoryStreams [ Wn . View . CurrentShowPosition ] . Length > 0 )
inkCanvas . Strokes . Add ( new StrokeCollection ( memoryStreams [ Wn . View . CurrentShowPosition ] ) ) ;
}
catch {
// ignored
}
2024-05-01 18:23:32 +08:00
2024-06-05 20:25:26 +08:00
PptNavigationTextBlock . Text = $"{Wn.View.CurrentShowPosition}/{Wn.Presentation.Slides.Count}" ;
} ) ;
previousSlideID = Wn . View . CurrentShowPosition ;
2024-05-01 18:23:32 +08:00
}
private bool _isPptClickingBtnTurned = false ;
private void BtnPPTSlidesUp_Click ( object sender , RoutedEventArgs e ) {
if ( currentMode = = 1 ) {
GridBackgroundCover . Visibility = Visibility . Collapsed ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardLeftSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardCenterSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardRightSide ) ;
currentMode = 0 ;
}
_isPptClickingBtnTurned = true ;
if ( inkCanvas . Strokes . Count > Settings . Automation . MinimumAutomationStrokeNumber & &
Settings . PowerPointSettings . IsAutoSaveScreenShotInPowerPoint )
2024-06-05 20:25:26 +08:00
SaveScreenShot ( true ,
pptApplication . SlideShowWindows [ 1 ] . Presentation . Name + "/" +
pptApplication . SlideShowWindows [ 1 ] . View . CurrentShowPosition ) ;
2024-05-01 18:23:32 +08:00
try {
new Thread ( new ThreadStart ( ( ) = > {
try {
pptApplication . SlideShowWindows [ 1 ] . Activate ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
// ignored
}
2024-05-01 18:23:32 +08:00
try {
pptApplication . SlideShowWindows [ 1 ] . View . Previous ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
// ignored
} // Without this catch{}, app will crash when click the pre-page button in the fir page in some special env.
2024-05-01 18:23:32 +08:00
} ) ) . Start ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
2024-05-01 18:23:32 +08:00
StackPanelPPTControls . Visibility = Visibility . Collapsed ;
BottomViewboxPPTSidesControl . Visibility = Visibility . Collapsed ;
LeftSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
RightSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
}
}
private void BtnPPTSlidesDown_Click ( object sender , RoutedEventArgs e ) {
if ( currentMode = = 1 ) {
GridBackgroundCover . Visibility = Visibility . Collapsed ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardLeftSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardCenterSide ) ;
AnimationsHelper . HideWithSlideAndFade ( BlackboardRightSide ) ;
currentMode = 0 ;
}
2024-06-05 20:25:26 +08:00
2024-05-01 18:23:32 +08:00
_isPptClickingBtnTurned = true ;
if ( inkCanvas . Strokes . Count > Settings . Automation . MinimumAutomationStrokeNumber & &
Settings . PowerPointSettings . IsAutoSaveScreenShotInPowerPoint )
2024-06-05 20:25:26 +08:00
SaveScreenShot ( true ,
pptApplication . SlideShowWindows [ 1 ] . Presentation . Name + "/" +
pptApplication . SlideShowWindows [ 1 ] . View . CurrentShowPosition ) ;
2024-05-01 18:23:32 +08:00
try {
new Thread ( new ThreadStart ( ( ) = > {
try {
pptApplication . SlideShowWindows [ 1 ] . Activate ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
// ignored
}
2024-05-01 18:23:32 +08:00
try {
pptApplication . SlideShowWindows [ 1 ] . View . Next ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
// ignored
}
2024-05-01 18:23:32 +08:00
} ) ) . Start ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
2024-05-01 18:23:32 +08:00
StackPanelPPTControls . Visibility = Visibility . Collapsed ;
BottomViewboxPPTSidesControl . Visibility = Visibility . Collapsed ;
LeftSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
RightSidePanelForPPTNavigation . Visibility = Visibility . Collapsed ;
}
}
private async void PPTNavigationBtn_Click ( object sender , MouseButtonEventArgs e ) {
if ( lastBorderMouseDownObject ! = sender ) return ;
2024-06-04 21:21:08 +08:00
GridTransparencyFakeBackground . Opacity = 1 ;
GridTransparencyFakeBackground . Background = new SolidColorBrush ( StringToColor ( "#01FFFFFF" ) ) ;
2024-05-01 18:23:32 +08:00
CursorIcon_Click ( null , null ) ;
try {
pptApplication . SlideShowWindows [ 1 ] . SlideNavigation . Visible = true ;
2024-06-05 20:25:26 +08:00
}
catch { }
2024-05-01 18:23:32 +08:00
// 控制居中
if ( ! isFloatingBarFolded ) {
await Task . Delay ( 100 ) ;
ViewboxFloatingBarMarginAnimation ( 60 ) ;
}
}
private void BtnPPTSlideShow_Click ( object sender , RoutedEventArgs e ) {
new Thread ( new ThreadStart ( ( ) = > {
try {
presentation . SlideShowSettings . Run ( ) ;
2024-06-05 20:25:26 +08:00
}
catch { }
2024-05-01 18:23:32 +08:00
} ) ) . Start ( ) ;
}
private async void BtnPPTSlideShowEnd_Click ( object sender , RoutedEventArgs e ) {
Application . Current . Dispatcher . Invoke ( ( ) = > {
try {
2024-06-05 20:25:26 +08:00
var ms = new MemoryStream ( ) ;
2024-05-01 18:23:32 +08:00
inkCanvas . Strokes . Save ( ms ) ;
ms . Position = 0 ;
memoryStreams [ pptApplication . SlideShowWindows [ 1 ] . View . CurrentShowPosition ] = ms ;
timeMachine . ClearStrokeHistory ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
// ignored
}
2024-05-01 18:23:32 +08:00
} ) ;
new Thread ( new ThreadStart ( ( ) = > {
try {
pptApplication . SlideShowWindows [ 1 ] . View . Exit ( ) ;
2024-06-05 20:25:26 +08:00
}
catch {
// ignored
}
2024-05-01 18:23:32 +08:00
} ) ) . Start ( ) ;
HideSubPanels ( "cursor" ) ;
await Task . Delay ( 150 ) ;
2024-05-13 01:54:04 +08:00
ViewboxFloatingBarMarginAnimation ( 100 , true ) ;
2024-05-01 18:23:32 +08:00
}
private void GridPPTControlPrevious_MouseUp ( object sender , MouseButtonEventArgs e ) {
if ( lastBorderMouseDownObject ! = sender ) return ;
BtnPPTSlidesUp_Click ( BtnPPTSlidesUp , null ) ;
}
private void GridPPTControlNext_MouseUp ( object sender , MouseButtonEventArgs e ) {
if ( lastBorderMouseDownObject ! = sender ) return ;
BtnPPTSlidesDown_Click ( BtnPPTSlidesDown , null ) ;
}
private void ImagePPTControlEnd_MouseUp ( object sender , MouseButtonEventArgs e ) {
BtnPPTSlideShowEnd_Click ( BtnPPTSlideShowEnd , null ) ;
}
}
2024-06-05 20:25:26 +08:00
}