OSDN Git Service

#34825, #36261 電源プランをHighPerformanceにするかどうかと、WASAPIをevent drivenで動作させるかどうかを、CONFIGURA...
[dtxmania/dtxmania.git] / DTXManiaプロジェクト / コード / 全体 / Program.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Globalization;\r
4 using System.Text;\r
5 using System.Runtime.InteropServices;\r
6 using System.Threading;\r
7 using System.Diagnostics;\r
8 using System.Windows.Forms;\r
9 using System.IO;\r
10 using FDK;\r
11 \r
12 namespace DTXMania\r
13 {\r
14         internal class Program\r
15         {\r
16                 #region [ 二重起動チェック、DLL存在チェック ]\r
17                 //-----------------------------\r
18                 private static Mutex mutex二重起動防止用;\r
19 \r
20                 private static bool tDLLの存在チェック(string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en, bool bLoadDllCheck)\r
21                 {\r
22                         string str存在しないときに表示するエラー文字列 = (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "ja") ?\r
23                                 str存在しないときに表示するエラー文字列jp : str存在しないときに表示するエラー文字列en;\r
24                         if (bLoadDllCheck)\r
25                         {\r
26                                 IntPtr hModule = LoadLibrary(strDll名);    // 実際にLoadDll()してチェックする\r
27                                 if (hModule == IntPtr.Zero)\r
28                                 {\r
29                                         MessageBox.Show(str存在しないときに表示するエラー文字列, "DTXMania runtime error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
30                                         return false;\r
31                                 }\r
32                                 FreeLibrary(hModule);\r
33                         }\r
34                         else\r
35                         {                         // 単純にファイルの存在有無をチェックするだけ (プロジェクトで「参照」していたり、アンマネージドなDLLが暗黙リンクされるものはこちら)\r
36                                 string path = Path.Combine(System.IO.Directory.GetCurrentDirectory(), strDll名);\r
37                                 if (!File.Exists(path))\r
38                                 {\r
39                                         MessageBox.Show(str存在しないときに表示するエラー文字列, "DTXMania runtime error", MessageBoxButtons.OK, MessageBoxIcon.Hand);\r
40                                         return false;\r
41                                 }\r
42                         }\r
43                         return true;\r
44                 }\r
45                 private static bool tDLLの存在チェック(string strDll名, string str存在しないときに表示するエラー文字列jp, string str存在しないときに表示するエラー文字列en)\r
46                 {\r
47                         //return true;\r
48                         return tDLLの存在チェック(strDll名, str存在しないときに表示するエラー文字列jp, str存在しないときに表示するエラー文字列en, false);\r
49                 }\r
50 \r
51                 #region [DllImport]\r
52                 [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]\r
53                 internal static extern void FreeLibrary(IntPtr hModule);\r
54 \r
55                 [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]\r
56                 internal static extern IntPtr LoadLibrary(string lpFileName);\r
57                 #endregion\r
58                 //-----------------------------\r
59                 #endregion\r
60 \r
61                 [STAThread]\r
62                 private static void Main()\r
63                 {\r
64                         mutex二重起動防止用 = new Mutex(false, "DTXManiaMutex");\r
65 \r
66                         if (mutex二重起動防止用.WaitOne(0, false))\r
67                         {\r
68                                 string newLine = Environment.NewLine;\r
69                                 bool bDLLnotfound = false;\r
70 \r
71                                 Trace.WriteLine("Current Directory: " + Environment.CurrentDirectory);\r
72                                 Trace.WriteLine("EXEのあるフォルダ: " + Path.GetDirectoryName(Application.ExecutablePath));\r
73 \r
74                                 #region [DLLの存在チェック]\r
75                                 if (!tDLLの存在チェック("dll\\SlimDX" + CDTXMania.SLIMDXDLL + ".dll",\r
76                                         "SlimDX" + CDTXMania.SLIMDXDLL + ".dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
77                                         "SlimDX" + CDTXMania.SLIMDXDLL + ".dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
78                                         ))\r
79                                         bDLLnotfound = true;\r
80                                 if (!tDLLの存在チェック("dll\\FDK.dll",\r
81                                         "FDK.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
82                                         "FDK.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
83                                         ))\r
84                                         bDLLnotfound = true;\r
85                                 if (!tDLLの存在チェック("xadec.dll",   // #35444 2015.8.27 yyagi; Changed dll path\r
86                                         "xadec.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
87                                         "xadec.dll is not found." + newLine + "Please download DTXMania again."\r
88                                         ))\r
89                                         bDLLnotfound = true;\r
90                                 if (!tDLLの存在チェック("dll\\SoundDecoder.dll",\r
91                                         "SoundDecoder.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
92                                         "SoundDecoder.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
93                                         ))\r
94                                         bDLLnotfound = true;\r
95                                 if (!tDLLの存在チェック(CDTXMania.D3DXDLL,\r
96                                         CDTXMania.D3DXDLL + " が存在しません。" + newLine + "DirectX Redist フォルダの DXSETUP.exe を実行し、" + newLine + "必要な DirectX ランタイムをインストールしてください。",\r
97                                         CDTXMania.D3DXDLL + " is not found." + newLine + "Please execute DXSETUP.exe in \"DirectX Redist\" folder, to install DirectX runtimes required for DTXMania.",\r
98                                         true\r
99                                         ))\r
100                                         bDLLnotfound = true;\r
101                                 if (!tDLLの存在チェック("dll\\bass.dll",\r
102                                         "bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
103                                         "baas.dll is not found." + newLine + "Please download DTXMania again."\r
104                                         ))\r
105                                         bDLLnotfound = true;\r
106                                 if (!tDLLの存在チェック("dll\\Bass.Net.dll",\r
107                                         "Bass.Net.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
108                                         "Bass.Net.dll is not found." + newLine + "Please download DTXMania again."\r
109                                         ))\r
110                                         bDLLnotfound = true;\r
111                                 if (!tDLLの存在チェック("dll\\bassmix.dll",\r
112                                         "bassmix.dll を読み込めません。bassmix.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
113                                         "bassmix.dll is not loaded. bassmix.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
114                                         ))\r
115                                         bDLLnotfound = true;\r
116                                 if (!tDLLの存在チェック("dll\\bassasio.dll",\r
117                                         "bassasio.dll を読み込めません。bassasio.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
118                                         "bassasio.dll is not loaded. bassasio.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
119                                         ))\r
120                                         bDLLnotfound = true;\r
121                                 if (!tDLLの存在チェック("dll\\basswasapi.dll",\r
122                                         "basswasapi.dll を読み込めません。basswasapi.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
123                                         "basswasapi.dll is not loaded. basswasapi.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
124                                         ))\r
125                                         bDLLnotfound = true;\r
126                                 if (!tDLLの存在チェック("dll\\bass_fx.dll",\r
127                                         "bass_fx.dll を読み込めません。bass_fx.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
128                                         "bass_fx.dll is not loaded. bass_fx.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
129                                         ))\r
130                                         bDLLnotfound = true;\r
131                                 if (!tDLLの存在チェック("dll\\DirectShowLib-2005.dll",\r
132                                         "DirectShowLib-2005.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
133                                         "DirectShowLib-2005.dll is not found." + newLine + "Please download DTXMania again."\r
134                                         ))\r
135                                         bDLLnotfound = true;\r
136                                 #endregion\r
137                                 if (!bDLLnotfound)\r
138                                 {\r
139 #if DEBUG && TEST_ENGLISH\r
140                                         Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );\r
141 #endif\r
142                                         Trace.TraceInformation( "Thread.CurrentThread.CurrentCulture=" + Thread.CurrentThread.CurrentCulture );\r
143 \r
144                                         DWM.EnableComposition(false); // Disable AeroGrass temporally\r
145 \r
146                                         // BEGIN #23670 2010.11.13 from: キャッチされない例外は放出せずに、ログに詳細を出力する。\r
147                                         // BEGIM #24606 2011.03.08 from: DEBUG 時は例外発生箇所を直接デバッグできるようにするため、例外をキャッチしないようにする。\r
148 #if !DEBUG\r
149                                         try\r
150 #endif\r
151                                         {\r
152                                                 CDTXMania.Instance.InitializeInstance();\r
153                                                 CDTXMania.Instance.Run();\r
154                                                 Trace.WriteLine("");\r
155                                                 Trace.WriteLine("遊んでくれてありがとう!");\r
156                                         }\r
157 #if !DEBUG\r
158                                         catch (Exception e)\r
159                                         {\r
160                                                 Trace.WriteLine("");\r
161                                                 Trace.Write(e.ToString());\r
162                                                 Trace.WriteLine("");\r
163                                                 Trace.WriteLine("エラーだゴメン!(涙");\r
164                                                 MessageBox.Show(e.ToString(), "DTXMania Error", MessageBoxButtons.OK, MessageBoxIcon.Error);    // #23670 2011.2.28 yyagi to show error dialog\r
165                                         }\r
166 #endif\r
167                                         // END #24606 2011.03.08 from\r
168                                         // END #23670 2010.11.13 from\r
169 \r
170                                         if (Trace.Listeners.Count > 1)\r
171                                                 Trace.Listeners.RemoveAt(1);\r
172                                 }\r
173 \r
174                                 // BEGIN #24615 2011.03.09 from: Mutex.WaitOne() が true を返した場合は、Mutex のリリースが必要である。\r
175 \r
176                                 mutex二重起動防止用.ReleaseMutex();\r
177                                 mutex二重起動防止用 = null;\r
178 \r
179                                 // END #24615 2011.03.09 from\r
180                         }\r
181                         else    // DTXManiaが既に起動中\r
182                         {\r
183 \r
184                                 // → 引数が0個の時はそのまま終了\r
185                                 // 1個( コンパクトモード or DTXV -S) か2個 (DTXV -Nxxx ファイル名)のときは、そのプロセスにコマンドラインを丸々投げて終了する\r
186 \r
187                                 for (int i = 0; i < 5; i++)   // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする\r
188                                 {\r
189                                         #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
190                                         // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
191                                         // DTXManiaでそのパターンはない?のでこのままいく。\r
192                                         // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
193 \r
194                                         Process current = Process.GetCurrentProcess();\r
195                                         Process[] running = Process.GetProcessesByName(current.ProcessName);\r
196                                         Process target = null;\r
197                                         //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
198 \r
199                                         foreach (Process p in running)\r
200                                         {\r
201                                                 if (p.Id != current.Id) // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す\r
202                                                 {\r
203                                                         if (p.MainModule.FileName == current.MainModule.FileName && p.MainWindowHandle != IntPtr.Zero)\r
204                                                         {\r
205                                                                 target = p;\r
206                                                                 break;\r
207                                                         }\r
208                                                 }\r
209                                         }\r
210                                         #endregion\r
211 \r
212                                         #region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]\r
213                                         if (target != null)\r
214                                         {\r
215                                                 string[] commandLineArgs = Environment.GetCommandLineArgs();\r
216                                                 if (commandLineArgs != null && commandLineArgs.Length > 1)\r
217                                                 {\r
218                                                         string arg = null;\r
219                                                         for (int j = 1; j < commandLineArgs.Length; j++)\r
220                                                         {\r
221                                                                 if (j == 1)\r
222                                                                 {\r
223                                                                         arg += commandLineArgs[j];\r
224                                                                 }\r
225                                                                 else\r
226                                                                 {\r
227                                                                         arg += " " + "\"" + commandLineArgs[j] + "\"";\r
228                                                                 }\r
229                                                         }\r
230 \r
231                                                         //Trace.TraceInformation( "Message=" + arg + ", len(w/o null)=" + arg.Length );\r
232 \r
233                                                         if (arg != null)\r
234                                                         {\r
235                                                                 FDK.CSendMessage.sendmessage(target.MainWindowHandle, current.MainWindowHandle, arg);\r
236                                                         }\r
237                                                 }\r
238                                                 break;\r
239                                         }\r
240                                         #endregion\r
241                                         else\r
242                                         {\r
243                                                 Trace.TraceInformation("メッセージ送信先のプロセスが見つからず。5回リトライします。");\r
244                                                 Thread.Sleep(200);\r
245                                         }\r
246                                 }\r
247                         }\r
248                 }\r
249         }\r
250 }\r