using PDF_Master.ViewModels; using Prism.Regions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using Prism.Events; using PDF_Master.EventAggregators; using PDF_Master.CustomControl; using Prism.Ioc; using PDF_Master.Helper; using System.IO; using ComPDFKit.PDFDocument; using PDFSettings; using PDF_Master.Properties; using System.Windows.Interop; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Diagnostics; namespace PDF_Master.Views { /// /// MainWindow.xaml 的交互逻辑 /// public partial class MainWindow : Window { public IEventAggregator aggregator; public IRegionManager region; /// /// 窗口大小是否改变 /// private bool sizeChange = false; public MainWindow() { InitializeComponent(); this.SourceInitialized += MainWindow_SourceInitialized; System.Windows.Forms.Application.EnableVisualStyles(); } private void MainWindow_SourceInitialized(object sender, EventArgs e) { try { //限制应用多开,显示已有窗体或者直接打开文件 IntPtr hwnd = new WindowInteropHelper(this).Handle; HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc)); } catch { } } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if (msg == App.MsgId) { try { int msgLength = (int)(lParam); IntPtr mapHandle = Win32Helper.OpenFileMapping((int)Win32Helper.FileMapAccessType.Read, 0, "Global\\sharePathNotify"); IntPtr readPtr = Win32Helper.MapViewOfFileEx(mapHandle, Win32Helper.FileMapAccessType.Read, 0, 0, UIntPtr.Zero, IntPtr.Zero); string filePath = Marshal.PtrToStringAuto(readPtr, msgLength); Win32Helper.UnmapViewOfFile(readPtr); Win32Helper.CloseHandle(mapHandle); MD5 currMd5 = MD5.Create(); byte[] hashArray = currMd5.ComputeHash(Encoding.Default.GetBytes(filePath)); StringBuilder hexBuilder = new StringBuilder(); foreach (byte code in hashArray) { hexBuilder.AppendFormat("{0:X2}", code); } IntPtr waitPtr = Win32Helper.OpenEvent(0x0002, false, "Global\\shareWaitNotify" + hexBuilder.ToString()); if (waitPtr != IntPtr.Zero) { Win32Helper.SetEvent(waitPtr); Win32Helper.CloseHandle(waitPtr); } if (File.Exists(filePath)) { //打开传过来的文件路径 if (App.OpenedFileList.Contains(filePath)) { //如果已经打开时,则选中文档所在页签 App.mainWindowViewModel.SelectItem(filePath); } else { (this.DataContext as MainWindowViewModel).AddTabItem(filePath); } if (WindowState == WindowState.Minimized) { WindowState = WindowState.Normal; } Activate(); } } catch { } handled = true; return (IntPtr)(1); } if (msg == App.WakeId || msg == App.WebopenexpiredId) { //将现有窗口激活 并前置 try { Activate(); //最小化后激活 if (this.WindowState == WindowState.Minimized) { System.Windows.SystemCommands.RestoreWindow(this); } //窗体前置 Topmost = true; Topmost = false; ServiceHelper.GetUser(); if (msg == App.WebopenexpiredId) { if (App.IsLogin == true && App.UserOpen == false) { App.mainWindowViewModel.OpenUser(); App.WebOpencase = ""; } else if (App.IsLogin == false && App.LoginOpen == false) { App.mainWindowViewModel.OpenLogin(); App.WebOpencase = ""; } } handled = true; } catch { } return (IntPtr)(1); } return IntPtr.Zero; } /// /// 此类因为Dragablz控件的原因需要特殊处理 /// /// public MainWindow(IEventAggregator eventAggregator, IContainerProvider container) : this() { aggregator = eventAggregator; eventAggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Opened }); } private void BtnMiniSize_Click(object sender, RoutedEventArgs e) { System.Windows.SystemCommands.MinimizeWindow(this); } private void BtnClose_Click(object sender, RoutedEventArgs e) { System.Windows.SystemCommands.CloseWindow(this); } private void BtnReStore_Click(object sender, RoutedEventArgs e) { if (this.WindowState == WindowState.Maximized) { System.Windows.SystemCommands.RestoreWindow(this); } else { System.Windows.SystemCommands.MaximizeWindow(this); } } private async void Window_Activated(object sender, EventArgs e) { App.Current.MainWindow = this; App.mainWindowViewModel = this.DataContext as MainWindowViewModel; aggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Activated }); //只需要第一次激活时获取一次信息 if (App.IsFirstOpen) { //判断本地有没有token,没有显示登录,有再判断登录状态 if (Settings.Default.AppProperties.LoginToken != "") { string code = ServiceHelper.GetUser(); if (code == "330" || code == "304") { App.mainWindowViewModel.UpgradeVis = Visibility.Visible; App.mainWindowViewModel.LoginVis = Visibility.Visible; App.mainWindowViewModel.RegisterVis = Visibility.Collapsed; App.mainWindowViewModel.OphVis = Visibility.Visible; if (Settings.Default.UserDate.IsLoginoff == false) { App.mainWindowViewModel.OpenLoginoff(); Settings.Default.UserDate.IsLoginoff = true; Settings.Default.Save(); } } else { App.IsLogin = true; App.mainWindowViewModel.Useremailchar = Settings.Default.UserDate.Email.Substring(0, 1); App.mainWindowViewModel.UserVis = Visibility.Visible; } } else if (Settings.Default.UserDate.Email != "") { App.mainWindowViewModel.UpgradeVis = Visibility.Visible; App.mainWindowViewModel.LoginVis = Visibility.Visible; App.mainWindowViewModel.RegisterVis = Visibility.Collapsed; App.mainWindowViewModel.OphVis = Visibility.Visible; } else { App.mainWindowViewModel.UpgradeVis = Visibility.Visible; App.mainWindowViewModel.RegisterVis = Visibility.Visible; App.mainWindowViewModel.LoginVis = Visibility.Collapsed; App.mainWindowViewModel.OphVis = Visibility.Visible; } App.IsFirstOpen = false; } //控制首页UPgrade按钮的显示与否 if (Settings.Default.UserDate.subscribestatus == 1) { App.mainWindowViewModel.UpgradeVis = Visibility.Collapsed; } else { App.mainWindowViewModel.UpgradeVis = Visibility.Visible; } //设为默认浏览器后,外部点击文档打开 if (App.NeedOpenFilePathList.Count != 0) { for (int i = 0; i < App.NeedOpenFilePathList.Count; i++) { (this.DataContext as MainWindowViewModel).AddTabItem(App.NeedOpenFilePathList[i]); await Task.Delay(50); } App.NeedOpenFilePathList.Clear(); } } private void Window_Closed(object sender, EventArgs e) { aggregator?.GetEvent().Publish(new DragablzWindowEventArgs() { TabControl = TabablzControl, Type = DragablzWindowEventType.Closed }); } public void LoadPdfViewer(string[] filePaths) { var content = App.mainWindowViewModel.SelectedItem.DataContext as MainContentViewModel; if (filePaths.Count() == 1) { if (App.OpenedFileList.Contains(filePaths[0])) { App.mainWindowViewModel.SelectItem(filePaths[0]); } else { content.OpenFile(filePaths[0]); } ToolMethod.SetFileThumbImg(filePaths[0]); } else { var fileList = filePaths.ToList().Where(x => !App.OpenedFileList.Exists(y => y == x)).ToList(); if (fileList.Count <= 0) return; content.OpenFile(filePaths[0]); for (int i = 1; i < fileList.Count(); i++) { if (!App.OpenedFileList.Contains(fileList[i])) { App.mainWindowViewModel.AddTabItem(fileList[i]); } ToolMethod.SetFileThumbImg(fileList[i]); } } Settings.Default.Save(); } private void Window_SizeChanged(object sender, SizeChangedEventArgs e) { if (this.WindowState == WindowState.Maximized) { ico_max.Visibility = Visibility.Collapsed; } else { ico_max.Visibility = Visibility.Visible; } UpdateTitleMargin(); if (this.ActualWidth != 1280) { sizeChange = true; } } /// /// 更新添加按钮的间隔位置 /// private void UpdateTitleMargin() { var width = StkPnlRight.ActualWidth; double width1 = this.ActualWidth; double width2 = TabablzControl.ActualWidth; if (BorderUpgrade.Visibility == Visibility.Collapsed) { BtnAdd.Margin = new Thickness(8, 13, width, 7); Trace.WriteLine("BorderUpgrade.Collapsed " + width1); Trace.WriteLine("BorderUpgrade.Collapsed " + width2); Trace.WriteLine("BorderUpgrade.Collapsed " + width); } else { Trace.WriteLine("BorderUpgrade.Visibility " + width1); Trace.WriteLine("BorderUpgrade.Visibility " + width2); Trace.WriteLine("BorderUpgrade.Visibility " + width); if (this.WindowState == WindowState.Maximized) { BtnAdd.Margin = new Thickness(8, 13, width, 7); } else { if (sizeChange) { BtnAdd.Margin = new Thickness(8, 13, width, 7); } else { sizeChange = false; BtnAdd.Margin = new Thickness(8, 13, width + 50, 7); } } } TabablzControl.UpdateLayout(); } private void TxtRename_PreviewKeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Enter) { TabablzControl.Focus(); } } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (!(DataContext as MainWindowViewModel).closeAllTabItem()) { e.Cancel = true; } } private void Window_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { //通过转移焦点来触发文本框失去焦点事件 var uiElement = FocusManager.GetFocusedElement(this); if (uiElement != null) { var textBox = uiElement as TextBox; //会影响页面编辑的下拉框选择 暂时注释 //if (textBox != null) //{ // GridRoot.Focusable = true; // GridRoot.Focus(); //} } } private void Grid_Openhight_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { UpdateTitleMargin(); } private async void Window_Loaded(object sender, RoutedEventArgs e) { if (App.Current.Windows.Count <= 1) { //软件打开,第一个窗体加载时,回传事件 //放在主窗体的显示事件里,避免因网络请求问题导致启动缓慢 await Task.Run(() => { //上传启动信息至服务端 ServiceHelper.CreateDeviceLog(); }); } } } }