Мне нужно иметь два способа запуска моей программы: обычный запуск с отображением формы, и скрытый запуск без отображения формы - при запуске винды. В обоих случаях создаётся иконка в трее.
Сделал так: если количество параметров, передаваемых при запуске более нуля, значит запускаем скрытно. Работает как надо. Далее я сделал так, чтобы прога автоматом запускалась при старте винды, поместив соответствующую строчку в реестр
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| string name = System.Windows.Forms.Application.ProductName;
string ExePath = string.Format
(
"{0} -nogui",
System.Windows.Forms.Application.ExecutablePath.ToString().Replace("EXE","exe")
);
Microsoft.Win32.RegistryKey reg;
reg = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
try
{
reg.SetValue(name, ExePath);
reg.Close();
}
catch { } |
|
Код открытия программы такой:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
| using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace RZD_Bonus_Keep
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
Application.SetCompatibleTextRenderingDefault(false);
// создаём трей и всё для него
// контекстное меню
var contmenu = new System.Windows.Forms.ContextMenu();
var menuItem1 = new System.Windows.Forms.MenuItem();
menuItem1.Text = "RZD Bonus Keep";
var menuItemSplitter = new System.Windows.Forms.MenuItem();
menuItemSplitter.Text = "-";
var menuItem2 = new System.Windows.Forms.MenuItem();
menuItem2.Text = "Открыть окно программы";
menuItem2.Click += new System.EventHandler(menuItemClick);
var menuItem3 = new System.Windows.Forms.MenuItem();
menuItem3.Text = "О программе";
var menuItem4 = new System.Windows.Forms.MenuItem();
menuItem4.Text = "Выход";
menuItem4.Click += new System.EventHandler(menuItem4Click);
contmenu.MenuItems.AddRange(
new System.Windows.Forms.MenuItem[]
{
menuItem1,
menuItemSplitter,
menuItem2,
menuItem3,
menuItemSplitter,
menuItem4
}
);
// всё по трею
NotifyIcon tray = new System.Windows.Forms.NotifyIcon();
tray.Visible = true;
tray.Icon = new System.Drawing.Icon("ico.ico");
tray.Text = "RZD Bonus Keeper";
tray.ContextMenu = contmenu;
tray.MouseClick += new MouseEventHandler(trayClick);
if (args.Length>0)
{
// запуск без окна
Application.Run();
}
else
{
// Запуск в графическом режиме
fmain = new fMain();
Application.Run(fmain);
}
}
static fMain fmain;
private static void trayClick(object Sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
GoGraphicView();
}
// клик по контекстному меню Открыть программу
private static void menuItemClick(object Sender, EventArgs e)
{
GoGraphicView();
}
private static void menuItem4Click(object Sender, EventArgs e)
{
if (MessageBox.Show("Вы уверены, что хотите закрыть приложение?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
Application.Exit();
}
static void GoGraphicView()
{
// Запуск в графическом режиме
// форма может быть уже запущена
if (fmain == null)
{
Application.EnableVisualStyles();
fmain = new fMain();
fmain.Show();
}
else
{
fmain.WindowState = FormWindowState.Maximized;
}
}
}
} |
|
При попытке запуститься автоматом со стартом винды получаем ошибку:
XML |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| <?xml version="1.0" encoding="UTF-16"?>
-<WERReportMetadata>
-<OSVersionInformation>
<WindowsNTVersion>6.1</WindowsNTVersion>
<Build>7601 Service Pack 1</Build>
<Product>(0x30): Windows 7 Professional</Product>
<Edition>Professional</Edition>
<BuildString>7601.18798.amd64fre.win7sp1_gdr.150316-1654</BuildString>
<Revision>1130</Revision>
<Flavor>Multiprocessor Free</Flavor>
<Architecture>X64</Architecture>
<LCID>1049</LCID>
</OSVersionInformation>
-<ProblemSignatures>
<EventType>CLR20r3</EventType>
<Parameter0>RZD-Bonus Keep.exe</Parameter0>
<Parameter1>1.0.0.0</Parameter1>
<Parameter2>587fa65e</Parameter2>
<Parameter3>mscorlib</Parameter3>
<Parameter4>4.6.1055.0</Parameter4>
<Parameter5>563c0eac</Parameter5>
<Parameter6>157f</Parameter6>
<Parameter7>ca</Parameter7>
<Parameter8>System.IO.FileNotFoundException</Parameter8>
</ProblemSignatures>
-<DynamicSignatures>
<Parameter1>6.1.7601.2.1.0.256.48</Parameter1>
<Parameter2>1049</Parameter2>
<Parameter22>0a9e</Parameter22>
<Parameter23>0a9e372d3b4ad19135b953a78882e789</Parameter23>
<Parameter24>0a9e</Parameter24>
<Parameter25>0a9e372d3b4ad19135b953a78882e789</Parameter25>
</DynamicSignatures>
-<SystemInformation>
<MID>7BA09EA0-B8C7-47C2-AF7D-C48FE21EE57D</MID>
<SystemManufacturer>To be filled by O.E.M.</SystemManufacturer>
<SystemProductName>To be filled by O.E.M.</SystemProductName>
<BIOSVersion>2501</BIOSVersion>
</SystemInformation>
</WERReportMetadata> |
|
В интернете не нашёл решения. опытным путём понял, что, если закомментить строку кода
C# |
1
| tray.Icon = new System.Drawing.Icon("ico.ico"); |
|
то ошибка не возникает, правда соответственно и иконка в трее не выходит.
В референсах у System.Drawing стоят такие настройки
Что сделать чтобы ошибка не возникала, куда копать?