using Apewer.Surface; using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Apewer.Tray { /// 托盘。 class Tray { Form _form = null; NotifyIcon _icon = null; Tray(Action action) { _tray = this; _form = new Form(); _form.FormBorderStyle = FormBorderStyle.None; _form.Size = new Size(0, 0); _form.StartPosition = FormStartPosition.CenterScreen; _form.ShowInTaskbar = false; _form.Text = ""; _form.Paint += (s, e) => { if (_form.Visible) { _form.Visible = false; action?.Invoke(); } }; Application.Run(_form); } static Tray _tray = null; static object _locker = new object(); /// 托盘图标。 public NotifyIcon Icon { get => _tray?._icon; } /// 在托盘线程中执行方法。 public static void Invoke(Action action, bool async = false) { lock (_locker) { if (action == null) return; if (_tray == null) return; if (async) _tray?._form.BeginInvoke(new Action(action)); else _tray?._form.Invoke(new Action(action)); } } /// 在托盘线程中执行方法。 public static void BeginInvoke(Action action) { lock (_locker) { if (action == null) return; if (_tray == null) return; _tray?._form.BeginInvoke(new Action(action)); } } /// 启动托盘,阻塞当前线程。 [STAThread] public static void Run(Action after = null) { lock (_locker) { if (_tray != null) return; FormsUtility.StartInitialization(); FormsUtility.CrossThread(); new Tray(after); } } /// 退出托盘。 public static void Exit() { lock (_locker) { if (_tray != null) { if (_tray._icon != null) { _tray._icon.Visible = false; _tray._icon.Dispose(); } _tray._form.Close(); _tray._form.Dispose(); } _tray = null; } } /// 显示托盘图标。 public static void ShowIcon(Icon icon = null) { lock (_locker) { if (_tray == null) return; if (_tray._icon == null) _tray._icon = new NotifyIcon(); _tray._icon.Icon = icon; _tray._icon.Visible = true; } } /// 隐藏托盘图标。 public static void HideIcon() { lock (_locker) { if (_tray == null) return; if (_tray._icon == null) return; _tray._icon.Visible = false; } } /// 显示消息对话框。 public static void MessageBox(string text, string caption = "", Action ok = null) { Invoke(() => { System.Windows.Forms.MessageBox.Show(text, caption, MessageBoxButtons.OK); ok?.Invoke(); }); } /// 显示确认对话框。 public static void YesNo(string text, string caption = "", Action yes = null, Action no = null) { Invoke(() => { var result = System.Windows.Forms.MessageBox.Show(text, caption, MessageBoxButtons.YesNo); if (result == DialogResult.Yes) yes?.Invoke(); else if (result == DialogResult.No) no?.Invoke(); }); } /// 显示打开文件对话框。 public static void OpenFile(string title = null, Action ok = null, Action cancel = null, bool multiselect = false, string filter = null, string directory = null) { Invoke(() => { DialogResult result; string[] paths; using (var dialog = new OpenFileDialog()) { if (!string.IsNullOrEmpty(title)) dialog.Title = title; if (!string.IsNullOrEmpty(filter)) dialog.Filter = filter; if (!string.IsNullOrEmpty(directory)) dialog.InitialDirectory = directory; dialog.Multiselect = multiselect; result = dialog.ShowDialog(); paths = dialog.FileNames; } if (result == DialogResult.OK) ok?.Invoke(paths); else if (result == DialogResult.Cancel) cancel?.Invoke(); }); } /// 显示保存文件对话框。 public static void SaveFile(string title = null, Action ok = null, Action cancel = null, string filter = null, string directory = null) { Invoke(() => { DialogResult result; string path; using (var dialog = new SaveFileDialog()) { if (!string.IsNullOrEmpty(title)) dialog.Title = title; if (!string.IsNullOrEmpty(filter)) dialog.Filter = filter; if (!string.IsNullOrEmpty(directory)) dialog.InitialDirectory = directory; result = dialog.ShowDialog(); path = dialog.FileName; } if (result == DialogResult.OK) ok?.Invoke(path); else if (result == DialogResult.Cancel) cancel?.Invoke(); }); } /// 显示选择文件夹对话框。 public static void SelectFolder(string description = null, Action ok = null, Action cancel = null) { Invoke(() => { DialogResult result; string path; using (var dialog = new FolderBrowserDialog()) { if (!string.IsNullOrEmpty(description)) dialog.Description = description; dialog.ShowNewFolderButton = true; result = dialog.ShowDialog(); path = dialog.SelectedPath; } if (result == DialogResult.OK) ok?.Invoke(path); else if (result == DialogResult.Cancel) cancel?.Invoke(); }); } } }