MainWindow.xaml.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. using GeekDesk.Constant;
  2. using GeekDesk.Control.UserControls.Config;
  3. using GeekDesk.Control.Windows;
  4. using GeekDesk.Interface;
  5. using GeekDesk.Task;
  6. using GeekDesk.MyThread;
  7. using GeekDesk.Util;
  8. using GeekDesk.ViewModel;
  9. using System;
  10. using System.Diagnostics;
  11. using System.Windows;
  12. using System.Windows.Controls;
  13. using System.Windows.Input;
  14. using System.Windows.Media.Animation;
  15. using static GeekDesk.Util.ShowWindowFollowMouse;
  16. using System.Collections.ObjectModel;
  17. using NPinyin;
  18. using GeekDesk.ViewModel.Temp;
  19. namespace GeekDesk
  20. {
  21. /// <summary>
  22. /// MainWindow.xaml 的交互逻辑
  23. /// </summary>
  24. ///
  25. public partial class MainWindow : Window, IWindowCommon
  26. {
  27. public static AppData appData = CommonCode.GetAppDataByFile();
  28. public static ToDoInfoWindow toDoInfoWindow;
  29. public static int hotKeyId = -1;
  30. public static int toDoHotKeyId = -1;
  31. public static MainWindow mainWindow;
  32. public MainWindow()
  33. {
  34. LoadData();
  35. InitializeComponent();
  36. mainWindow = this;
  37. this.Topmost = true;
  38. this.Loaded += Window_Loaded;
  39. this.SizeChanged += MainWindow_Resize;
  40. ToDoTask.BackLogCheck();
  41. ////实例化隐藏 Hide类,进行时间timer设置
  42. MarginHide.ReadyHide(this);
  43. if (appData.AppConfig.MarginHide)
  44. {
  45. MarginHide.StartHide();
  46. }
  47. }
  48. /// <summary>
  49. /// 显示搜索框
  50. /// </summary>
  51. /// <param name="sender"></param>
  52. /// <param name="e"></param>
  53. private void SearchItem(object sender, CanExecuteRoutedEventArgs e)
  54. {
  55. RightCard.VisibilitySearchCard(Visibility.Visible);
  56. SearchBox.Visibility = Visibility.Visible;
  57. SearchBox.Focus();
  58. }
  59. /// <summary>
  60. /// 搜索开始
  61. /// </summary>
  62. /// <param name="sender"></param>
  63. /// <param name="e"></param>
  64. private void SearchBox_TextChanged(object sender, TextChangedEventArgs e)
  65. {
  66. string inputText = SearchBox.Text.ToLower();
  67. if (!string.IsNullOrEmpty(inputText))
  68. {
  69. SearchIconList.IconList.Clear();
  70. ObservableCollection<MenuInfo> menuList = appData.MenuList;
  71. foreach (MenuInfo menu in menuList)
  72. {
  73. ObservableCollection<IconInfo> iconList = menu.IconList;
  74. foreach (IconInfo icon in iconList)
  75. {
  76. string pyName = Pinyin.GetInitials(icon.Name).ToLower();
  77. if (icon.Name.Contains(inputText) || pyName.Contains(inputText))
  78. {
  79. SearchIconList.IconList.Add(icon);
  80. }
  81. }
  82. }
  83. }
  84. else
  85. {
  86. SearchIconList.IconList.Clear();
  87. }
  88. }
  89. /// <summary>
  90. /// 隐藏搜索框
  91. /// </summary>
  92. /// <param name="sender"></param>
  93. /// <param name="e"></param>
  94. private void SearchBox_LostFocus(object sender, RoutedEventArgs e)
  95. {
  96. SearchIconList.IconList.Clear();
  97. RightCard.VisibilitySearchCard(Visibility.Collapsed);
  98. SearchBox.Visibility = Visibility.Collapsed;
  99. SearchBox.Text = "";
  100. }
  101. /// <summary>
  102. /// 加载缓存数据
  103. /// </summary>
  104. private void LoadData()
  105. {
  106. GC.KeepAlive(appData); // 持活
  107. this.DataContext = appData;
  108. if (appData.MenuList.Count == 0)
  109. {
  110. appData.MenuList.Add(new MenuInfo() { MenuName = "NewMenu", MenuId = System.Guid.NewGuid().ToString(), MenuEdit = Visibility.Collapsed });
  111. }
  112. this.Width = appData.AppConfig.WindowWidth;
  113. this.Height = appData.AppConfig.WindowHeight;
  114. }
  115. /// <summary>
  116. /// 窗口加载完毕 执行方法
  117. /// </summary>
  118. /// <param name="sender"></param>
  119. /// <param name="e"></param>
  120. void Window_Loaded(object sender, RoutedEventArgs e)
  121. {
  122. if (!appData.AppConfig.StartedShowPanel)
  123. {
  124. if (appData.AppConfig.AppAnimation)
  125. {
  126. this.Opacity = 0;
  127. }
  128. else
  129. {
  130. this.Visibility = Visibility.Collapsed;
  131. }
  132. }
  133. else
  134. {
  135. ShowApp();
  136. }
  137. //给任务栏图标一个名字
  138. BarIcon.Text = Constants.MY_NAME;
  139. //注册热键
  140. RegisterHotKey(true);
  141. RegisterCreateToDoHotKey(true);
  142. //注册自启动
  143. if (!appData.AppConfig.SelfStartUped && !Constants.DEV)
  144. {
  145. RegisterUtil.SetSelfStarting(appData.AppConfig.SelfStartUp, Constants.MY_NAME);
  146. }
  147. //注册鼠标中键监听事件
  148. if (appData.AppConfig.MouseMiddleShow)
  149. {
  150. MouseHookThread.MiddleHook();
  151. }
  152. //更新线程开启 检测更新
  153. UpdateThread.Update();
  154. }
  155. /// <summary>
  156. /// 注册当前窗口的热键
  157. /// </summary>
  158. public static void RegisterHotKey(bool first)
  159. {
  160. try
  161. {
  162. if (appData.AppConfig.HotkeyModifiers != 0)
  163. {
  164. hotKeyId = GlobalHotKey.RegisterHotKey(appData.AppConfig.HotkeyModifiers, appData.AppConfig.Hotkey, () =>
  165. {
  166. if (MotionControl.hotkeyFinished)
  167. {
  168. if (mainWindow.Visibility == Visibility.Collapsed || mainWindow.Opacity == 0 || MarginHide.IS_HIDE)
  169. {
  170. ShowApp();
  171. }
  172. else
  173. {
  174. HideApp();
  175. }
  176. }
  177. });
  178. }
  179. if (!first)
  180. {
  181. HandyControl.Controls.Growl.Success("GeekDesk快捷键注册成功(" + appData.AppConfig.HotkeyStr + ")!", "HotKeyGrowl");
  182. }
  183. }
  184. catch (Exception)
  185. {
  186. if (first)
  187. {
  188. HandyControl.Controls.Growl.WarningGlobal("GeekDesk启动快捷键已被其它程序占用(" + appData.AppConfig.HotkeyStr + ")!");
  189. }
  190. else
  191. {
  192. HandyControl.Controls.Growl.Warning("GeekDesk启动快捷键已被其它程序占用(" + appData.AppConfig.HotkeyStr + ")!", "HotKeyGrowl");
  193. }
  194. }
  195. }
  196. /// <summary>
  197. /// 注册新建待办的热键
  198. /// </summary>
  199. public static void RegisterCreateToDoHotKey(bool first)
  200. {
  201. try
  202. {
  203. if (appData.AppConfig.ToDoHotkeyModifiers != 0)
  204. {
  205. //加载完毕注册热键
  206. toDoHotKeyId = GlobalHotKey.RegisterHotKey(appData.AppConfig.ToDoHotkeyModifiers, appData.AppConfig.ToDoHotkey, () =>
  207. {
  208. if (MotionControl.hotkeyFinished)
  209. {
  210. ToDoInfoWindow.ShowOrHide();
  211. }
  212. });
  213. }
  214. if (!first)
  215. {
  216. HandyControl.Controls.Growl.Success("新建待办任务快捷键注册成功(" + appData.AppConfig.ToDoHotkeyStr + ")!", "HotKeyGrowl");
  217. }
  218. }
  219. catch (Exception)
  220. {
  221. if (first)
  222. {
  223. HandyControl.Controls.Growl.WarningGlobal("新建待办任务快捷键已被其它程序占用(" + appData.AppConfig.ToDoHotkeyStr + ")!");
  224. }
  225. else
  226. {
  227. HandyControl.Controls.Growl.Warning("新建待办任务快捷键已被其它程序占用(" + appData.AppConfig.ToDoHotkeyStr + ")!", "HotKeyGrowl");
  228. }
  229. }
  230. }
  231. /// <summary>
  232. /// 重置窗体大小 写入缓存
  233. /// </summary>
  234. /// <param name="sender"></param>
  235. /// <param name="e"></param>
  236. void MainWindow_Resize(object sender, System.EventArgs e)
  237. {
  238. if (this.DataContext != null)
  239. {
  240. AppData appData = this.DataContext as AppData;
  241. appData.AppConfig.WindowWidth = this.Width;
  242. appData.AppConfig.WindowHeight = this.Height;
  243. }
  244. }
  245. /// <summary>
  246. /// 程序窗体拖动
  247. /// </summary>
  248. /// <param name="sender"></param>
  249. /// <param name="e"></param>
  250. private void DragMove(object sender, MouseEventArgs e)
  251. {
  252. if (e.LeftButton == MouseButtonState.Pressed)
  253. {
  254. var windowMode = this.ResizeMode;
  255. if (this.ResizeMode != ResizeMode.NoResize)
  256. {
  257. this.ResizeMode = ResizeMode.NoResize;
  258. }
  259. this.UpdateLayout();
  260. /* 当点击拖拽区域的时候,让窗口跟着移动
  261. (When clicking the drag area, make the window follow) */
  262. DragMove();
  263. if (this.ResizeMode != windowMode)
  264. {
  265. this.ResizeMode = windowMode;
  266. }
  267. this.UpdateLayout();
  268. }
  269. }
  270. /// <summary>
  271. /// 关闭按钮单击事件
  272. /// </summary>
  273. /// <param name="sender"></param>
  274. /// <param name="e"></param>
  275. private void CloseButtonClick(object sender, RoutedEventArgs e)
  276. {
  277. if (appData.AppConfig.AppAnimation)
  278. {
  279. FadeStoryBoard(0, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Collapsed);
  280. }
  281. else
  282. {
  283. this.Visibility = Visibility.Collapsed;
  284. }
  285. }
  286. ///// <summary>
  287. ///// 左侧栏宽度改变 持久化
  288. ///// </summary>
  289. ///// <param name="sender"></param>
  290. ///// <param name="e"></param>
  291. //private void LeftCardResize(object sender, System.Windows.Controls.Primitives.DragCompletedEventArgs e)
  292. //{
  293. // appData.AppConfig.MenuCardWidth = LeftColumn.Width.Value;
  294. //}
  295. /// <summary>
  296. /// 右键任务栏图标 显示主面板
  297. /// </summary>
  298. /// <param name="sender"></param>
  299. /// <param name="e"></param>
  300. private void ShowApp(object sender, RoutedEventArgs e)
  301. {
  302. ShowApp();
  303. }
  304. public static void ShowApp()
  305. {
  306. //有全屏化应用则不显示
  307. //if (CommonCode.IsPrimaryFullScreen())
  308. //{
  309. // return;
  310. //}
  311. //修改贴边隐藏状态为未隐藏
  312. mainWindow.Activate();
  313. MarginHide.IS_HIDE = false;
  314. if (appData.AppConfig.FollowMouse)
  315. {
  316. ShowWindowFollowMouse.Show(mainWindow, MousePosition.CENTER, 0, 0, false);
  317. }
  318. FadeStoryBoard(1, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Visible);
  319. mainWindow.Focus();
  320. }
  321. public static void HideApp()
  322. {
  323. FadeStoryBoard(0, (int)CommonEnum.WINDOW_ANIMATION_TIME, Visibility.Collapsed);
  324. }
  325. /// <summary>
  326. /// 淡入淡出效果
  327. /// </summary>
  328. /// <param name="opacity"></param>
  329. /// <param name="milliseconds"></param>
  330. /// <param name="visibility"></param>
  331. public static void FadeStoryBoard(int opacity, int milliseconds, Visibility visibility)
  332. {
  333. if (appData.AppConfig.AppAnimation)
  334. {
  335. DoubleAnimation opacityAnimation = new DoubleAnimation
  336. {
  337. From = mainWindow.Opacity,
  338. To = opacity,
  339. Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds))
  340. };
  341. opacityAnimation.Completed += (s, e) =>
  342. {
  343. mainWindow.BeginAnimation(OpacityProperty, null);
  344. if (visibility == Visibility.Visible)
  345. {
  346. mainWindow.Opacity = 1;
  347. }
  348. else
  349. {
  350. mainWindow.Opacity = 0;
  351. CommonCode.SortIconList();
  352. }
  353. };
  354. Timeline.SetDesiredFrameRate(opacityAnimation, 60);
  355. mainWindow.BeginAnimation(OpacityProperty, opacityAnimation);
  356. }
  357. else
  358. {
  359. //防止关闭动画后 窗体仍是0透明度
  360. mainWindow.Opacity = 1;
  361. mainWindow.Visibility = visibility;
  362. if (visibility == Visibility.Collapsed)
  363. {
  364. CommonCode.SortIconList();
  365. }
  366. }
  367. }
  368. /// <summary>
  369. /// 图片图标单击事件
  370. /// </summary>
  371. /// <param name="sender"></param>
  372. /// <param name="e"></param>
  373. private void NotifyIcon_Click(object sender, RoutedEventArgs e)
  374. {
  375. if (this.Visibility == Visibility.Collapsed || this.Opacity == 0)
  376. {
  377. ShowApp();
  378. }
  379. else
  380. {
  381. HideApp();
  382. }
  383. }
  384. /// <summary>
  385. /// 右键任务栏图标 设置
  386. /// </summary>
  387. /// <param name="sender"></param>
  388. /// <param name="e"></param>
  389. private void ConfigApp(object sender, RoutedEventArgs e)
  390. {
  391. ConfigWindow.Show(appData.AppConfig, this);
  392. }
  393. /// <summary>
  394. /// 右键任务栏图标打开程序目录
  395. /// </summary>
  396. /// <param name="sender"></param>
  397. /// <param name="e"></param>
  398. private void OpenThisDir(object sender, RoutedEventArgs e)
  399. {
  400. Process p = new Process();
  401. p.StartInfo.FileName = "Explorer.exe";
  402. p.StartInfo.Arguments = "/e,/select," + Constants.APP_DIR + Constants.MY_NAME + ".exe";
  403. p.Start();
  404. }
  405. /// <summary>
  406. /// 设置图标
  407. /// </summary>
  408. /// <param name="sender"></param>
  409. /// <param name="e"></param>
  410. private void ConfigButtonClick(object sender, RoutedEventArgs e)
  411. {
  412. SettingMenus.IsOpen = true;
  413. }
  414. /// <summary>
  415. /// 设置菜单点击
  416. /// </summary>
  417. /// <param name="sender"></param>
  418. /// <param name="e"></param>
  419. private void ConfigMenuClick(object sender, RoutedEventArgs e)
  420. {
  421. ConfigWindow.Show(appData.AppConfig, this);
  422. }
  423. /// <summary>
  424. /// 待办任务
  425. /// </summary>
  426. /// <param name="sender"></param>
  427. /// <param name="e"></param>
  428. private void BacklogMenuClick(object sender, RoutedEventArgs e)
  429. {
  430. ToDoWindow.Show();
  431. }
  432. /// <summary>
  433. /// 禁用设置按钮右键菜单
  434. /// </summary>
  435. /// <param name="sender"></param>
  436. /// <param name="e"></param>
  437. private void SettingButton_Initialized(object sender, EventArgs e)
  438. {
  439. SettingButton.ContextMenu = null;
  440. }
  441. private void App_LostFocus(object sender, EventArgs e)
  442. {
  443. if (appData.AppConfig.AppHideType == AppHideType.LOST_FOCUS
  444. && this.Opacity == 1)
  445. {
  446. //如果开启了贴边隐藏 则窗体不贴边才隐藏窗口
  447. if (!appData.AppConfig.MarginHide || (appData.AppConfig.MarginHide && !MarginHide.IS_HIDE))
  448. {
  449. HideApp();
  450. }
  451. }
  452. }
  453. private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
  454. {
  455. if (this.DataContext != null)
  456. {
  457. AppData appData = this.DataContext as AppData;
  458. appData.AppConfig.WindowWidth = this.Width;
  459. appData.AppConfig.WindowHeight = this.Height;
  460. }
  461. }
  462. /// <summary>
  463. /// 右键任务栏图标退出
  464. /// </summary>
  465. /// <param name="sender"></param>
  466. /// <param name="e"></param>
  467. private void ExitApp(object sender, RoutedEventArgs e)
  468. {
  469. if (appData.AppConfig.MouseMiddleShow)
  470. {
  471. MouseHookThread.Dispose();
  472. }
  473. Application.Current.Shutdown();
  474. }
  475. /// <summary>
  476. /// 重启
  477. /// </summary>
  478. /// <param name="sender"></param>
  479. /// <param name="e"></param>
  480. private void ReStartApp(object sender, RoutedEventArgs e)
  481. {
  482. if (appData.AppConfig.MouseMiddleShow)
  483. {
  484. MouseHookThread.Dispose();
  485. }
  486. Process p = new Process();
  487. p.StartInfo.FileName = Constants.APP_DIR + "GeekDesk.exe";
  488. p.StartInfo.WorkingDirectory = Constants.APP_DIR;
  489. p.Start();
  490. Application.Current.Shutdown();
  491. }
  492. /// <summary>
  493. /// 关闭托盘图标
  494. /// </summary>
  495. /// <param name="sender"></param>
  496. /// <param name="e"></param>
  497. private void CloseBarIcon(object sender, RoutedEventArgs e)
  498. {
  499. appData.AppConfig.ShowBarIcon = false;
  500. }
  501. public void OnKeyDown(object sender, KeyEventArgs e)
  502. {
  503. if (e.Key == Key.Escape)
  504. {
  505. HideApp();
  506. }
  507. }
  508. /// <summary>
  509. /// 为了让修改菜单的textBox失去焦点
  510. /// </summary>
  511. /// <param name="sender"></param>
  512. /// <param name="e"></param>
  513. private void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
  514. {
  515. EmptyTextBox.Focus();
  516. }
  517. }
  518. }