You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
6.9 KiB

using Apewer.Surface;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Apewer.Tray
{
/// <summary>托盘。</summary>
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();
/// <summary>托盘图标。</summary>
public NotifyIcon Icon { get => _tray?._icon; }
/// <summary>在托盘线程中执行方法。</summary>
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));
}
}
/// <summary>在托盘线程中执行方法。</summary>
public static void BeginInvoke(Action action)
{
lock (_locker)
{
if (action == null) return;
if (_tray == null) return;
_tray?._form.BeginInvoke(new Action(action));
}
}
/// <summary>启动托盘,阻塞当前线程。</summary>
[STAThread]
public static void Run(Action after = null)
{
lock (_locker)
{
if (_tray != null) return;
FormsUtility.StartInitialization();
FormsUtility.CrossThread();
new Tray(after);
}
}
/// <summary>退出托盘。</summary>
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;
}
}
/// <summary>显示托盘图标。</summary>
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;
}
}
/// <summary>隐藏托盘图标。</summary>
public static void HideIcon()
{
lock (_locker)
{
if (_tray == null) return;
if (_tray._icon == null) return;
_tray._icon.Visible = false;
}
}
/// <summary>显示消息对话框。</summary>
public static void MessageBox(string text, string caption = "", Action ok = null)
{
Invoke(() =>
{
System.Windows.Forms.MessageBox.Show(text, caption, MessageBoxButtons.OK);
ok?.Invoke();
});
}
/// <summary>显示确认对话框。</summary>
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();
});
}
/// <summary>显示打开文件对话框。</summary>
public static void OpenFile(string title = null, Action<string[]> 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();
});
}
/// <summary>显示保存文件对话框。</summary>
public static void SaveFile(string title = null, Action<string> 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();
});
}
/// <summary>显示选择文件夹对话框。</summary>
public static void SelectFolder(string description = null, Action<string> 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();
});
}
}
}