Sfall-ScriptEditor
67 строк · 2.3 Кб
1using System;
2using System.IO;
3using System.Runtime.InteropServices;
4
5namespace ScriptEditor
6{
7/// <summary>
8/// Handles enforcing single application instance and interacting with running instance.
9/// </summary>
10public static class SingleInstanceManager
11{
12private const int HWND_BROADCAST = 0xffff;
13
14private static readonly string CommandLineFile = Path.Combine(Path.GetTempPath(), "commandline.txt");
15
16[DllImport("user32")]
17private static extern bool PostMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
18
19[DllImport("user32")]
20private static extern int RegisterWindowMessage(string message);
21
22public static readonly int WM_SFALL_SCRIPT_EDITOR_OPEN = RegisterWindowMessage("WM_SFALL_SCRIPT_EDITOR_4_OPEN");
23
24public static void SendEditorOpenMessage()
25{
26SingleInstanceManager.PostMessage(
27(IntPtr)SingleInstanceManager.HWND_BROADCAST,
28SingleInstanceManager.WM_SFALL_SCRIPT_EDITOR_OPEN,
29IntPtr.Zero,
30IntPtr.Zero);
31}
32
33/// <summary>
34/// Saves command line arguments for use in another instance.
35/// </summary>
36/// <param name="args"></param>
37public static void SaveCommandLine(string[] args)
38{
39var fullArgs = new string[args.Length];
40for (int i = 0; i < args.Length; i++) {
41fullArgs[i] = Path.IsPathRooted(args[i])
42? args[i]
43: Path.GetFullPath(args[i]);
44File.AppendAllText(SingleInstanceManager.CommandLineFile, fullArgs[i] + Environment.NewLine);
45}
46}
47
48/// <summary>
49/// Loads command line arguments previously saved by another instance.
50/// </summary>
51/// <returns></returns>
52public static string[] LoadCommandLine()
53{
54if (File.Exists(SingleInstanceManager.CommandLineFile)) {
55string[] read = File.ReadAllLines(SingleInstanceManager.CommandLineFile);
56DeleteCommandLine();
57return read;
58}
59return new string[0];
60}
61
62public static void DeleteCommandLine()
63{
64File.Delete(CommandLineFile);
65}
66}
67}
68