OSDN Git Service

#28821 DTXManiaをDTXVとして使えるようにするための改造を実施。とりあえず以下に対応。
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Mon, 27 Jan 2014 16:57:40 +0000 (16:57 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Mon, 27 Jan 2014 16:57:40 +0000 (16:57 +0000)
* DTXMania本体が起動していない時に、(DTXCreatorがDTXVを呼び出すときにつける) 引数をつけてDTXManiaを起動すると、コンパクトモードで起動し、フェードアウトなしで即座に指定された小節から演奏開始する。
* DTXMania本体が起動して、演奏画面の時に限り、(DTXCreatorがDTXVを呼び出すときにつける) 引数をつけてDTXManiaを追加起動すると、既に起動しているDTXManiaのウインドウの再生小節を変更する。(DTXVの動作と同じ)
* DTXVモードのときには、タイトルバーの表示が変わる。

以下の制限あり。
* DTXVモード時も、DTXMania本体の設定をそのまま流用する。そのため、例えば全AUTOに設定されていないと、DTXVの代わりにならない。
* Drum画面のみ。GRモードでは非対応。
* 再生停止に非対応。
* DTXCが「DTXManiaをDTXVとして呼び出す」ことに非対応。
* BGAやAVIの再生位置切り替えが不完全。

#xxxxx ASIO初期化時の余計なデバッグメッセージを削除。

git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/branches/140113(DTXMania098%20with%2028821%20DTXVmode)@671 16f42ceb-6dc6-49c8-ba94-f2d53467949d

19 files changed:
DTXManiaプロジェクト/DTXManiaプロジェクト.csproj
DTXManiaプロジェクト/コード/スコア、曲/CDTX.cs
DTXManiaプロジェクト/コード/ステージ/04.コンフィグ/CActConfigList.cs
DTXManiaプロジェクト/コード/ステージ/06.曲読み込み/CStage曲読み込み.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/CStage演奏画面共通.cs
DTXManiaプロジェクト/コード/ステージ/07.演奏/ドラム画面/CStage演奏ドラム画面.cs
DTXManiaプロジェクト/コード/ステージ/CDTXVmode.cs [new file with mode: 0644]
DTXManiaプロジェクト/コード/全体/CDTXMania.cs
DTXManiaプロジェクト/コード/全体/Program.cs
FDK17プロジェクト/FDK19.csproj
FDK17プロジェクト/コード/01.フレームワーク/Core/GameWindow.cs
FDK17プロジェクト/コード/01.フレームワーク/Win32/NativeStructures.cs
FDK17プロジェクト/コード/01.フレームワーク/Win32/WindowConstants.cs
FDK17プロジェクト/コード/03.サウンド/CSoundDeviceASIO.cs
実行時フォルダ(DTXCreator)/DTXCreator.exe
実行時フォルダ(DTXCreator)/dll/FDK.dll
実行時フォルダ(DTXCreator)/ja-JP/DTXCreator.resources.dll
実行時フォルダ/DTXManiaGR.exe
実行時フォルダ/dll/FDK.dll

index 06f117b..f7b045b 100644 (file)
     <Compile Include="コード\ステージ\CActFIFOWhite.cs" />\r
     <Compile Include="コード\ステージ\CActLVLNFont.cs" />\r
     <Compile Include="コード\ステージ\CActオプションパネル.cs" />\r
+    <Compile Include="コード\ステージ\CDTXVmode.cs" />\r
     <Compile Include="コード\ステージ\CStage.cs" />\r
     <Compile Include="コード\プラグイン\CPluginHost.cs" />\r
     <Compile Include="コード\プラグイン\IPluginActivity.cs" />\r
index 73acac8..1cc4c42 100644 (file)
@@ -369,7 +369,7 @@ namespace DTXMania
                                return builder.ToString();\r
                        }\r
                }\r
-               public class CChip : IComparable<CDTX.CChip>\r
+               public class CChip : IComparable<CDTX.CChip>, ICloneable\r
                {\r
                        public bool bHit;\r
                        public bool b可視 = true;\r
@@ -636,6 +636,14 @@ namespace DTXMania
                        }\r
                        //-----------------\r
                        #endregion\r
+                       /// <summary>\r
+                       /// shallow copyです。\r
+                       /// </summary>\r
+                       /// <returns></returns>\r
+                       public object Clone()\r
+                       {\r
+                               return MemberwiseClone();\r
+                       }\r
                }\r
                public class CWAV : IDisposable\r
                {\r
index c62ee4f..80410c7 100644 (file)
@@ -1752,7 +1752,7 @@ namespace DTXMania
                                                                                0,\r
                                                                                // this.iSystemASIOBufferSizeMs.n現在の値,\r
                                                                                this.iSystemASIODevice.n現在選択されている項目番号 );\r
-                               CDTXMania.app.AddSoundTypeToWindowTitle();\r
+                               CDTXMania.app.ShowWindowTitleWithSoundType();\r
                        }\r
                        #endregion\r
                        #region [ サウンドのタイムストレッチモード変更 ]\r
@@ -2384,7 +2384,6 @@ namespace DTXMania
 //Trace.TraceInformation( "Skin現在Current : " + CDTXMania.Skin.GetCurrentSkinSubfolderFullName(true) );\r
 //Trace.TraceInformation( "Skin現在System  : " + CSkin.strSystemSkinSubfolderFullName );\r
 //Trace.TraceInformation( "Skin現在BoxDef  : " + CSkin.strBoxDefSkinSubfolderFullName );\r
-               \r
                }\r
                private void tConfigIniへ記録する・Bass()\r
                {\r
index 2ac5d77..31f4eb2 100644 (file)
@@ -364,14 +364,17 @@ namespace DTXMania
 //                                             if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms - 1000 ) )\r
                                                if ( ( nCurrentTime - this.nBGM再生開始時刻 ) > ( this.nBGMの総再生時間ms ) )       // #27787 2012.3.10 yyagi 1000ms == フェードイン分の時間\r
                                                {\r
-                                                       this.actFO.tフェードアウト開始();\r
+                                                       if ( !CDTXMania.DTXVmode.Enabled )\r
+                                                       {\r
+                                                               this.actFO.tフェードアウト開始();\r
+                                                       }\r
                                                        base.eフェーズID = CStage.Eフェーズ.共通_フェードアウト;\r
                                                }\r
                                                return (int) E曲読込画面の戻り値.継続;\r
                                        }\r
 \r
                                case CStage.Eフェーズ.共通_フェードアウト:\r
-                                       if( this.actFO.On進行描画() == 0 )\r
+                                       if ( this.actFO.On進行描画() == 0 && !CDTXMania.DTXVmode.Enabled )          // DTXVモード時は、フェードアウト省略\r
                                                return 0;\r
 \r
                                        if ( txFilename != null )\r
index 9b656a3..c004a14 100644 (file)
@@ -293,8 +293,7 @@ namespace DTXMania
                        queueMixerSound = new Queue<stmixer>( 64 );\r
                        bIsDirectSound = ( CDTXMania.Sound管理.GetCurrentSoundDeviceType() == "DirectSound" );\r
                        db再生速度 = ( (double) CDTXMania.ConfigIni.n演奏速度 ) / 20.0;\r
-                       bValidScore = true;\r
-                       bDTXVmode = false;      // とりあえずfalse固定\r
+                       bValidScore = (CDTXMania.DTXVmode.Enabled)? false : true;\r
 \r
                        #region [ 演奏開始前にmixer登録しておくべきサウンド(開幕してすぐに鳴らすことになるチップ音)を登録しておく ]\r
                        foreach ( CDTX.CChip pChip in listChip )\r
@@ -607,7 +606,7 @@ namespace DTXMania
                protected bool bIsDirectSound;                                                  //\r
                protected double db再生速度;\r
                protected bool bValidScore;\r
-               protected bool bDTXVmode;\r
+//             protected bool bDTXVmode;\r
                protected STDGBVALUE<int> nJudgeLinePosY_delta;                 // #31602 2013.6.23 yyagi 表示遅延対策として、判定ラインの表示位置をずらす機能を追加する\r
 \r
                protected STDGBVALUE<Queue<CDTX.CChip>> queWailing;\r
index 49a5419..134cff0 100644 (file)
@@ -158,92 +158,9 @@ namespace DTXMania
                                        base.eフェーズID = CStage.Eフェーズ.共通_フェードイン;\r
                                        this.actFI.tフェードイン開始();\r
 \r
-//                                     if ( this.bDTXVmode )\r
+                                       if ( CDTXMania.DTXVmode.Enabled )                       // DTXVモードなら\r
                                        {\r
-                                               #region [テストコード: 再生開始小節の変更]\r
-#if false\r
-                                               int nStartBar = 30;\r
-                                               #region [ 処理を開始するチップの特定 ]\r
-                                               bool bSuccessSeek = false;\r
-                                               for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )\r
-                                               {\r
-                                                       CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
-                                                       if ( pChip.n発声位置 < 384 * nStartBar )\r
-                                                       {\r
-                                                               continue;\r
-                                                       }\r
-                                                       else\r
-                                                       {\r
-                                                               bSuccessSeek = true;\r
-                                                               this.n現在のトップChip = i;\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                               if ( !bSuccessSeek )\r
-                                               {\r
-                                                       this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;\r
-                                               }\r
-                                               #endregion\r
-                                               #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]\r
-                                               int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;\r
-                                               CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
-                                               CSound管理.rc演奏用タイマ.t一時停止();\r
-                                               #endregion\r
-\r
-                                               List<CSound> pausedCSound = new List<CSound>();\r
-\r
-                                               #region [ BGMの途中再生開始 (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと) ]\r
-                                               foreach ( CDTX.CChip pChip in this.listChip )\r
-                                               {\r
-                                                       if ( pChip.nチャンネル番号 == 0x01 )\r
-                                                       {\r
-                                                               CDTX.CWAV wc = CDTXMania.DTX.listWAV[ pChip.n整数値・内部番号 ];\r
-                                                               int nDuration = ( wc.rSound[ 0 ] == null ) ? 0 : (int) ( wc.rSound[ 0 ].n総演奏時間ms / CDTXMania.DTX.db再生速度 );\r
-//                                                             if (wc.bIsBGMSound || wc.bIsGuitarSound || wc.bIsBassSound || wc.bIsBGMSound || wc.bIsSESound )\r
-                                                               {\r
-                                                                       if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )\r
-                                                                       {\r
-                                                                               if ( CDTXMania.ConfigIni.bBGM音を発声する )\r
-                                                                               {\r
-                                                                                       CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
-                                                                                       //CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n現在時刻ms + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
-                                                                                       for ( int i = 0; i < wc.rSound.Length; i++ )\r
-                                                                                       {\r
-                                                                                               if ( wc.rSound[ i ] != null )\r
-                                                                                               {\r
-                                                                                                       wc.rSound[ i ].t再生を一時停止する();\r
-                                                                                                       wc.rSound[ i ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );\r
-                                                                                                       pausedCSound.Add( wc.rSound[ i ] );\r
-                                                                                               }\r
-                                                                                       }\r
-                                                                               }\r
-                                                                               break;\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                               #endregion\r
-// 以下未実装 ここから\r
-                                               #region [ 演奏開始時点で既に演奏中になっているチップの再生とシーク (一つ手前のBGM処理のところに混ぜてもいいかも  ]\r
-                                               #endregion\r
-                                               #region [ 演奏開始時点で既に表示されているBGAの再生とシーク (BGAの動きの途中状況を反映すること) ]\r
-                                               #endregion\r
-                                               #region [ 演奏開始時点で既に表示されているAVIの再生とシーク (AVIの動きの途中状況を反映すること) ]\r
-                                               #endregion\r
-\r
-// 未実装 ここまで\r
-                                               #region [ PAUSEしていたサウンドを一斉に再生再開する ]\r
-                                               foreach ( CSound cs in pausedCSound )\r
-                                               {\r
-                                                       cs.tサウンドを再生する();\r
-                                               }\r
-                                               pausedCSound.Clear();\r
-                                               pausedCSound = null;\r
-                                               #endregion\r
-                                               CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
-                                               CSound管理.rc演奏用タイマ.t再開();\r
-#endif\r
-                                       #endregion\r
+                                               t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );\r
                                        }\r
                                        base.b初めての進行描画 = false;\r
                                }\r
@@ -285,9 +202,17 @@ namespace DTXMania
                                bIsFinishedFadeout = this.t進行描画・フェードイン・アウト();\r
                                if( bIsFinishedPlaying && ( base.eフェーズID == CStage.Eフェーズ.共通_通常状態 ) )\r
                                {\r
-                                       this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;\r
-                                       base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;\r
-                                       this.actFOClear.tフェードアウト開始();\r
+                                       if ( CDTXMania.DTXVmode.Enabled )\r
+                                       {\r
+                                               Thread.Sleep( 5 );\r
+                                               // DTXCからの次のメッセージを待ち続ける\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               this.eフェードアウト完了時の戻り値 = E演奏画面の戻り値.ステージクリア;\r
+                                               base.eフェーズID = CStage.Eフェーズ.演奏_STAGE_CLEAR_フェードアウト;\r
+                                               this.actFOClear.tフェードアウト開始();\r
+                                       }\r
                                }\r
                                if( bIsFinishedFadeout )\r
                                {\r
@@ -306,6 +231,110 @@ namespace DTXMania
                        return 0;\r
                }\r
 \r
+               public void t演奏位置の変更( int nStartBar )\r
+               {\r
+                       // まず全サウンドオフにすること\r
+                       CDTXMania.DTX.t全チップの再生停止();\r
+\r
+                       #region [テストコード: 再生開始小節の変更]\r
+                       //int nStartBar = CDTXMania.DTXVmode.nStartBar + 1;     // +1が必要\r
+                       #region [ 処理を開始するチップの特定 ]\r
+                       bool bInitialized = false;\r
+\r
+                       // 演奏済みフラグのついたChipをリセットする\r
+                       for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
+                       {\r
+                               CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
+                               if ( pChip.bHit )\r
+                               {\r
+                                       CDTX.CChip p = (CDTX.CChip) pChip.Clone();\r
+                                       p.bHit = false;\r
+                                       CDTXMania.DTX.listChip[ i ] = p;\r
+                               }\r
+                       }\r
+\r
+                       //for ( int i = this.n現在のトップChip; i < CDTXMania.DTX.listChip.Count; i++ )\r
+                       bool bSuccessSeek = false;\r
+                       for ( int i = 0; i < CDTXMania.DTX.listChip.Count; i++ )\r
+                       {\r
+                               CDTX.CChip pChip = CDTXMania.DTX.listChip[ i ];\r
+                               if ( pChip.n発声位置 < 384 * nStartBar )\r
+                               {\r
+                                       continue;\r
+                               }\r
+                               else\r
+                               {\r
+                                       bSuccessSeek = true;\r
+                                       this.n現在のトップChip = i;\r
+                                       break;\r
+                               }\r
+                       }\r
+                       if ( !bSuccessSeek )\r
+                       {\r
+                               this.n現在のトップChip = CDTXMania.DTX.listChip.Count - 1;\r
+                       }\r
+                       #endregion\r
+                       #region [ 演奏開始の発声時刻msを取得し、タイマに設定 ]\r
+                       int nStartTime = CDTXMania.DTX.listChip[ this.n現在のトップChip ].n発声時刻ms;\r
+                       CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
+                       CSound管理.rc演奏用タイマ.t一時停止();\r
+                       #endregion\r
+\r
+                       List<CSound> pausedCSound = new List<CSound>();\r
+\r
+                       #region [ BGMの途中再生開始 (CDTXのt入力・行解析・チップ配置()で小節番号が+1されているのを削っておくこと) ]\r
+                       foreach ( CDTX.CChip pChip in this.listChip )\r
+                       {\r
+                               if ( pChip.nチャンネル番号 == 0x01 )\r
+                               {\r
+                                       CDTX.CWAV wc = CDTXMania.DTX.listWAV[ pChip.n整数値・内部番号 ];\r
+                                       int nDuration = ( wc.rSound[ 0 ] == null ) ? 0 : (int) ( wc.rSound[ 0 ].n総演奏時間ms / CDTXMania.DTX.db再生速度 );\r
+                                       //                                                              if (wc.bIsBGMSound || wc.bIsGuitarSound || wc.bIsBassSound || wc.bIsBGMSound || wc.bIsSESound )\r
+                                       {\r
+                                               if ( ( pChip.n発声時刻ms + nDuration > 0 ) && ( pChip.n発声時刻ms <= nStartTime ) && ( nStartTime <= pChip.n発声時刻ms + nDuration ) )\r
+                                               {\r
+                                                       if ( ( wc.bIsBGMSound && CDTXMania.ConfigIni.bBGM音を発声する ) || ( !wc.bIsBGMSound ) )\r
+                                                       {\r
+                                                               CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n前回リセットした時のシステム時刻 + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
+                                                               //CDTXMania.DTX.tチップの再生( pChip, CSound管理.rc演奏用タイマ.n現在時刻ms + pChip.n発声時刻ms, (int) Eレーン.BGM, CDTXMania.DTX.nモニタを考慮した音量( E楽器パート.UNKNOWN ) );\r
+                                                               for ( int i = 0; i < wc.rSound.Length; i++ )\r
+                                                               {\r
+                                                                       if ( wc.rSound[ i ] != null )\r
+                                                                       {\r
+                                                                               wc.rSound[ i ].t再生を一時停止する();\r
+                                                                               wc.rSound[ i ].t再生位置を変更する( nStartTime - pChip.n発声時刻ms );\r
+                                                                               pausedCSound.Add( wc.rSound[ i ] );\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+                       #endregion\r
+                       // 以下未実装 ここから\r
+                       #region [ 演奏開始時点で既に演奏中になっているチップの再生とシーク (一つ手前のBGM処理のところに混ぜてもいいかも  ]\r
+                       #endregion\r
+                       #region [ 演奏開始時点で既に表示されているBGAの再生とシーク (BGAの動きの途中状況を反映すること) ]\r
+                       #endregion\r
+                       #region [ 演奏開始時点で既に表示されているAVIの再生とシーク (AVIの動きの途中状況を反映すること) ]\r
+                       #endregion\r
+\r
+                       // 未実装 ここまで\r
+                       #region [ PAUSEしていたサウンドを一斉に再生再開する ]\r
+                       foreach ( CSound cs in pausedCSound )\r
+                       {\r
+                               cs.tサウンドを再生する();\r
+                       }\r
+                       pausedCSound.Clear();\r
+                       pausedCSound = null;\r
+                       #endregion\r
+                       CSound管理.rc演奏用タイマ.n現在時刻 = nStartTime;\r
+                       CDTXMania.Timer.n現在時刻 = nStartTime;                             // Debug表示のTime: 表記を正しくするために必要\r
+                       CSound管理.rc演奏用タイマ.t再開();\r
+                       #endregion\r
+               }\r
 \r
                // その他\r
 \r
diff --git a/DTXManiaプロジェクト/コード/ステージ/CDTXVmode.cs b/DTXManiaプロジェクト/コード/ステージ/CDTXVmode.cs
new file mode 100644 (file)
index 0000000..2abb82e
--- /dev/null
@@ -0,0 +1,162 @@
+using System;\r
+using System.Collections.Generic;\r
+using System.Text;\r
+using System.Diagnostics;\r
+using System.IO;\r
+using FDK;\r
+\r
+\r
+namespace DTXMania\r
+{\r
+       public class CDTXVmode\r
+       {\r
+               /// <summary>\r
+               /// DTXVモードかどうか\r
+               /// </summary>\r
+               public bool Enabled\r
+               {\r
+                       get;\r
+                       set;\r
+               }\r
+\r
+               /// <summary>\r
+               /// 外部から再指示が発生したか\r
+               /// </summary>\r
+               public bool Refreshed\r
+               {\r
+                       get;\r
+                       set;\r
+               }\r
+\r
+               /// <summary>\r
+               /// 演奏開始小節番号\r
+               /// </summary>\r
+               public int nStartBar\r
+               {\r
+                       get;\r
+                       set;\r
+               }\r
+\r
+               public string filename\r
+               {\r
+                       get\r
+                       {\r
+                               return last_path;\r
+                       }\r
+               }\r
+\r
+\r
+               /// <summary>\r
+               /// コンストラクタ\r
+               /// </summary>\r
+               public CDTXVmode()\r
+               {\r
+                       this.last_path = "";\r
+                       this.last_timestamp = DateTime.MinValue;\r
+                       this.Enabled = false;\r
+                       this.nStartBar = 0;\r
+                       this.Refreshed = false;\r
+               }\r
+\r
+               /// <summary>\r
+               /// DTXファイルのリロードが必要かどうか判定する\r
+               /// </summary>\r
+               /// <param name="filename">DTXファイル名</param>\r
+               /// <returns></returns>\r
+               /// <exception cref="FileNotFoundException"></exception>\r
+               public bool bIsNeedReloadDTX( string filename )\r
+               {\r
+                       if ( !File.Exists( filename ) )                 // 指定したファイルが存在しないなら例外終了\r
+                       {\r
+                               Trace.TraceError( "ファイルが見つかりません。({0})", filename );\r
+                               throw new FileNotFoundException();\r
+                               //return false;\r
+                       }\r
+\r
+                       this.Refreshed = true;\r
+\r
+                       // 前回とファイル名が異なるか、タイムスタンプが更新されているなら、DTX要更新\r
+                       DateTime current_timestamp = File.GetLastWriteTime( filename );\r
+                       if ( last_path != filename || current_timestamp > last_timestamp)\r
+                       {\r
+                               this.last_path = filename;\r
+                               this.last_timestamp = current_timestamp;\r
+                               return true;\r
+                       }\r
+                       return false;\r
+               }\r
+\r
+               /// <summary>\r
+               /// \r
+               /// </summary>\r
+               /// <param name="arg"></param>\r
+               /// <param name="nStartBar"></param>\r
+               /// <param name="command"></param>\r
+               /// <returns>DTXV用の引数であればtrue</returns>\r
+               /// <remarks>内部でEnabled, nStartBar, last_path, last_timestampを設定する</remarks>\r
+               public bool ParseArguments( string arg, out string strCommand, out bool bNeedReload )\r
+               {\r
+                       bool ret = false;\r
+                       this.nStartBar = 0;\r
+                       strCommand = "";\r
+                       bNeedReload = false;\r
+\r
+                       if ( arg != null )\r
+                       {\r
+                               // -S  -Nxxx  filename\r
+                               if ( arg.StartsWith( "-S", StringComparison.OrdinalIgnoreCase ) )               // DTXV再生停止\r
+                               {\r
+                                       this.Enabled = true;\r
+                                       strCommand = "-S";\r
+                                       ret = true;\r
+                               }\r
+                               else if ( arg.StartsWith( "-N", StringComparison.OrdinalIgnoreCase ) )\r
+                               {\r
+                                       this.Enabled = true;\r
+                                       strCommand = "-N";\r
+                                       ret = true;\r
+\r
+                                       arg = arg.Substring( 2 );                                       // "-N"を除去\r
+                                       string[] p = arg.Split( new char[] { ' ' } );\r
+                                       this.nStartBar = int.Parse( p[ 0 ] );                   // 再生開始小節\r
+                                       if ( this.nStartBar < 0 )\r
+                                       {\r
+                                               this.nStartBar = 0;\r
+                                       }\r
+//Debug.WriteLine( "再生開始小節: " + this.nStartBar );\r
+\r
+                                       int startIndex = arg.IndexOf( ' ' );\r
+                                       string filename = arg.Substring( startIndex + 1 );    // 再生ファイル名(フルパス)\r
+                                       try\r
+                                       {\r
+//Debug.WriteLine( "filename_quoted=" + filename );\r
+                                               filename = filename.Trim( new char[] { '\"' } );\r
+                                               if ( bIsNeedReloadDTX( filename ) )\r
+                                               {\r
+//Debug.WriteLine( filename + ": 要reload" );\r
+                                                       bNeedReload = true;\r
+                                                       // もし前回のものより更新されていれば、DTXを読み直し\r
+                                               }\r
+                                               else\r
+                                               {\r
+//Debug.WriteLine( filename + ": reload不要" );\r
+                                                       bNeedReload = false;\r
+                                                       // さもなくば、読み直しなしで、再生位置だけを変更\r
+                                               }\r
+                                       }\r
+                                       catch   // 指定ファイルが存在しない\r
+                                       {\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return ret;\r
+               }\r
+\r
+\r
+\r
+               private string last_path;\r
+               private DateTime last_timestamp;\r
+\r
+       }\r
+}\r
index 0c6578f..630cf6e 100644 (file)
@@ -41,11 +41,11 @@ namespace DTXMania
                        get;\r
                        private set;\r
                }\r
-               public static bool bDTXVモード\r
-               {\r
-                       get;\r
-                       set;\r
-               }\r
+               //public static bool bDTXVモード\r
+               //{\r
+               //    get;\r
+               //    set;\r
+               //}\r
                public static CConfigIni ConfigIni\r
                {\r
                        get; \r
@@ -81,6 +81,7 @@ namespace DTXMania
                        get;\r
                        private set;\r
                }\r
+               #region [ 入力範囲ms ]\r
                public static int nPerfect範囲ms\r
                {\r
                        get\r
@@ -141,6 +142,7 @@ namespace DTXMania
                                return ConfigIni.nヒット範囲ms.Poor;\r
                        }\r
                }\r
+               #endregion\r
                public static CPad Pad \r
                {\r
                        get;\r
@@ -298,6 +300,11 @@ namespace DTXMania
                {\r
                        get { return base.Window.Handle; }\r
                }\r
+               public static CDTXVmode DTXVmode                        // #28821 2014.1.23 yyagi\r
+               {\r
+                       get;\r
+                       set;\r
+               }\r
                #endregion\r
 \r
                // コンストラクタ\r
@@ -532,6 +539,55 @@ namespace DTXMania
                        }\r
                        #endregion\r
 \r
+                       #region [ DTXCreatorからの指示 ]\r
+                       if ( this.Window.IsReceivedMessage )    // ウインドウメッセージで、\r
+                       {\r
+                               string strMes = this.Window.strMessage;\r
+                               this.Window.IsReceivedMessage = false;\r
+\r
+                               if ( strMes != null )\r
+                               {\r
+                                       bool bNeedReload;\r
+                                       string strCommand;\r
+\r
+//Debug.WriteLine( "msg arg=" + strMes );\r
+                                       DTXVmode.ParseArguments( strMes, out strCommand, out bNeedReload );\r
+\r
+                                       if ( DTXVmode.Enabled )\r
+                                       {\r
+//Debug.WriteLine( "DTXV mode is enabled," );\r
+                                               bコンパクトモード = true;\r
+                                               strコンパクトモードファイル = DTXVmode.filename;\r
+                                       }\r
+\r
+                                       if ( strCommand == "-S" )               // DTXV再生停止\r
+                                       {\r
+                                               // 再生停止処理を入れること\r
+                                       }\r
+                                       else if ( strCommand == "-N" )\r
+                                       {\r
+                                               bコンパクトモード = true;\r
+                                               DTXVmode.Enabled = true;\r
+\r
+//Debug.WriteLine( "再生開始小節: " + DTXVmode.nStartBar );\r
+\r
+                                               if ( bNeedReload )\r
+                                               {\r
+//Debug.WriteLine( DTXVmode.filename + ": 要reload" );\r
+                                                               // もし前回のものより更新されていれば、DTXを読み直し\r
+                                               }\r
+                                               else\r
+                                               {\r
+//Debug.WriteLine( DTXVmode.filename + ": reload不要" );\r
+                                                               // さもなくば、読み直しなしで、再生位置だけを変更\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // 場合によってはDTXVモードをON\r
+                       }\r
+                       #endregion\r
+\r
                        this.Device.BeginScene();\r
                        this.Device.Clear( ClearFlags.ZBuffer | ClearFlags.Target, Color.Black, 1f, 0 );\r
 \r
@@ -1070,6 +1126,16 @@ for (int i = 0; i < 3; i++) {
                                        case CStage.Eステージ.演奏:\r
                                                #region [ *** ]\r
                                                //-----------------------------\r
+\r
+                                               if ( DTXVmode.Enabled && DTXVmode.Refreshed )\r
+                                               {\r
+                                                       DTXVmode.Refreshed = false;\r
+                                                       if ( !ConfigIni.bギタレボモード )\r
+                                                       {\r
+                                                               CDTXMania.stage演奏ドラム画面.t演奏位置の変更( CDTXMania.DTXVmode.nStartBar );\r
+                                                       }\r
+                                               }\r
+\r
                                                switch( this.n進行描画の戻り値 )\r
                                                {\r
                                                        case (int) E演奏画面の戻り値.継続:\r
@@ -1490,7 +1556,20 @@ for (int i = 0; i < 3; i++) {
                private List<CActivity> listトップレベルActivities;\r
                private int n進行描画の戻り値;\r
                private MouseButtons mb = System.Windows.Forms.MouseButtons.Left;\r
-               private string strWindowTitle = "";\r
+               private string strWindowTitle\r
+               {\r
+                       get\r
+                       {\r
+                               if ( DTXVmode.Enabled )\r
+                               {\r
+                                       return "DTXViewer release " + VERSION;\r
+                               }\r
+                               else\r
+                               {\r
+                                       return "DTXMania .NET style release " + VERSION;\r
+                               }\r
+                       }\r
+               }\r
 \r
                private void t起動処理()\r
                {\r
@@ -1557,7 +1636,23 @@ for (int i = 0; i < 3; i++) {
                        Trace.TraceInformation( "CLR Version: " + Environment.Version.ToString() );\r
                        //---------------------\r
                        #endregion\r
-                       #region [ コンパクトモードスイッチの有無 ]\r
+                       #region [ DTXVmodeクラス の初期化 ]\r
+                       //---------------------\r
+                       Trace.TraceInformation( "DTXVモードの初期化を行います。" );\r
+                       Trace.Indent();\r
+                       try\r
+                       {\r
+                               DTXVmode = new CDTXVmode();\r
+                               DTXVmode.Enabled = false;\r
+                               Trace.TraceInformation( "DTXVモードの初期化を完了しました。" );\r
+                       }\r
+                       finally\r
+                       {\r
+                               Trace.Unindent();\r
+                       }\r
+                       //---------------------\r
+                       #endregion\r
+                       #region [ コンパクトモードスイッチの有無、もしくは、DTXViewerとしての起動 ]\r
                        //---------------------\r
                        bコンパクトモード = false;\r
                        strコンパクトモードファイル = "";\r
@@ -1565,7 +1660,29 @@ for (int i = 0; i < 3; i++) {
                        if( ( commandLineArgs != null ) && ( commandLineArgs.Length > 1 ) )\r
                        {\r
                                bコンパクトモード = true;\r
-                               strコンパクトモードファイル = commandLineArgs[ 1 ];\r
+                               bool bNeedReload;\r
+                               string strCommand;\r
+                               string arg = "";\r
+\r
+                               for ( int i = 1; i < commandLineArgs.Length; i++ )\r
+                               {\r
+                                       if ( i != 1 )\r
+                                       {\r
+                                               arg += " ";\r
+                                       }\r
+                                       arg += commandLineArgs[ i ];\r
+                               }\r
+                               DTXVmode.ParseArguments( arg, out strCommand, out bNeedReload );\r
+                               \r
+                               if ( DTXVmode.Enabled )\r
+                               {\r
+                                       strコンパクトモードファイル = DTXVmode.filename;\r
+                               }\r
+                               else                                                                                                            // 通常のコンパクトモード\r
+                               {\r
+                                       strコンパクトモードファイル = commandLineArgs[ 1 ];\r
+                               }\r
+\r
                                if ( !File.Exists( strコンパクトモードファイル ) )          // #32985 2014.1.23 yyagi \r
                                {\r
                                        Trace.TraceError( "コンパクトモードで指定されたファイルが見つかりません。DTXManiaを終了します。[{0}]", strコンパクトモードファイル );\r
@@ -1576,18 +1693,20 @@ for (int i = 0; i < 3; i++) {
 #endif\r
                                }\r
                                Trace.TraceInformation( "コンパクトモードで起動します。[{0}]", strコンパクトモードファイル );\r
+                               if ( DTXVmode.Enabled )\r
+                               {\r
+                                       Trace.TraceInformation( "DTXVモードです。" );\r
+                               }\r
                        }\r
                        //---------------------\r
                        #endregion\r
 \r
                        #region [ ウィンドウ初期化 ]\r
                        //---------------------\r
-                       this.strWindowTitle = "DTXMania .NET style release " + VERSION;\r
-\r
                        base.Window.StartPosition = FormStartPosition.Manual;                                                       // #30675 2013.02.04 ikanick add\r
                        base.Window.Location = new Point( ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y );   // #30675 2013.02.04 ikanick add\r
 \r
-                       base.Window.Text = this.strWindowTitle;\r
+                       base.Window.Text = this.strWindowTitle;         // 事前にDTXVmodeの実体を作っておくこと\r
 \r
                        base.Window.StartPosition = FormStartPosition.Manual;                                                       // #30675 2013.02.04 ikanick add\r
             base.Window.Location = new Point(ConfigIni.n初期ウィンドウ開始位置X, ConfigIni.n初期ウィンドウ開始位置Y);   // #30675 2013.02.04 ikanick add\r
@@ -1696,6 +1815,8 @@ for (int i = 0; i < 3; i++) {
                        }\r
                        //---------------------\r
                        #endregion\r
+                       //-----------\r
+\r
                        #region [ FPS カウンタの初期化 ]\r
                        //---------------------\r
                        Trace.TraceInformation( "FPSカウンタの初期化を行います。" );\r
@@ -1832,7 +1953,7 @@ for (int i = 0; i < 3; i++) {
                                                                                        0,\r
                                                                                        CDTXMania.ConfigIni.nASIODevice\r
                                );\r
-                               AddSoundTypeToWindowTitle();\r
+                               ShowWindowTitleWithSoundType();\r
                                FDK.CSound管理.bIsTimeStretch = CDTXMania.ConfigIni.bTimeStretch;\r
                                Trace.TraceInformation( "サウンドデバイスの初期化を完了しました。" );\r
                        }\r
@@ -1981,7 +2102,7 @@ for (int i = 0; i < 3; i++) {
                        #endregion\r
                }\r
 \r
-               public void AddSoundTypeToWindowTitle()\r
+               public void ShowWindowTitleWithSoundType()\r
                {\r
                        string delay = "";\r
                        if ( Sound管理.GetCurrentSoundDeviceType() != "DirectSound" )\r
@@ -2226,7 +2347,6 @@ for (int i = 0; i < 3; i++) {
                                }\r
                                //---------------------\r
                                #endregion\r
-\r
                                #region [ タイマの終了処理 ]\r
                                //---------------------\r
                                Trace.TraceInformation("タイマの終了処理を行います。");\r
@@ -2262,13 +2382,42 @@ for (int i = 0; i < 3; i++) {
                                Trace.Indent();\r
                                try\r
                                {\r
-                                       ConfigIni.t書き出し( str );\r
-                                       Trace.TraceInformation( "保存しました。({0})", new object[] { str } );\r
+                                       if ( DTXVmode.Enabled )\r
+                                       {\r
+                                               Trace.TraceInformation( "DTXVモードだったため、Config.iniは保存しません。" );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               ConfigIni.t書き出し( str );\r
+                                               Trace.TraceInformation( "保存しました。({0})", str );\r
+                                       }\r
                                }\r
                                catch( Exception e )\r
                                {\r
                                        Trace.TraceError( e.Message );\r
-                                       Trace.TraceError( "Config.ini の出力に失敗しました。({0})", new object[] { str } );\r
+                                       Trace.TraceError( "Config.ini の出力に失敗しました。({0})", str );\r
+                               }\r
+                               finally\r
+                               {\r
+                                       Trace.Unindent();\r
+                               }\r
+                               //---------------------\r
+                               #endregion\r
+                               #region [ DTXVmodeの終了処理 ]\r
+                               //---------------------\r
+                               Trace.TraceInformation( "DTXVモードの終了処理を行います。" );\r
+                               Trace.Indent();\r
+                               try\r
+                               {\r
+                                       if ( DTXVmode != null )\r
+                                       {\r
+                                               DTXVmode = null;\r
+                                               Trace.TraceInformation( "DTXVモードの終了処理を完了しました。" );\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               Trace.TraceInformation( "DTXVモードは使用されていません。" );\r
+                                       }\r
                                }\r
                                finally\r
                                {\r
@@ -2276,7 +2425,7 @@ for (int i = 0; i < 3; i++) {
                                }\r
                                //---------------------\r
                                #endregion\r
-                               Trace.TraceInformation("アプリケーションの終了処理を完了しました。");\r
+                               Trace.TraceInformation( "アプリケーションの終了処理を完了しました。" );\r
 \r
 \r
                                this.b終了処理完了済み = true;\r
index 9a2ce51..77fa0ac 100644 (file)
@@ -57,74 +57,81 @@ namespace DTXMania
                //-----------------------------\r
                #endregion\r
 \r
+\r
+\r
+\r
+               //[DllImport( "user32.dll" )]\r
+               //public static extern IntPtr FindWindow( string lpClassName, string lpWindowName );\r
+\r
+\r
                [STAThread] \r
                private static void Main()\r
                {\r
                        mutex二重起動防止用 = new Mutex( false, "DTXManiaMutex" );\r
 \r
-                       if( mutex二重起動防止用.WaitOne( 0, false ) )\r
+                       if ( mutex二重起動防止用.WaitOne( 0, false ) )\r
                        {\r
                                string newLine = Environment.NewLine;\r
-                               bool flag = false;\r
+                               bool bDLLnotfound = false;\r
 \r
                                #region [DLLの存在チェック]\r
                                if ( !tDLLの存在チェック( "dll\\SlimDX" + CDTXMania.SLIMDXDLL + ".dll",\r
                                        "SlimDX" + CDTXMania.SLIMDXDLL + ".dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "SlimDX" + CDTXMania.SLIMDXDLL + ".dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\FDK.dll",\r
                                        "FDK.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "FDK.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\xadec.dll",\r
                                        "xadec.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "xadec.dll is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\SoundDecoder.dll",\r
                                        "SoundDecoder.dll またはその依存するdllが存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "SoundDecoder.dll, or its depended DLL, is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( CDTXMania.D3DXDLL,\r
                                        CDTXMania.D3DXDLL + " が存在しません。" + newLine + "DirectX Redist フォルダの DXSETUP.exe を実行し、" + newLine + "必要な DirectX ランタイムをインストールしてください。",\r
                                        CDTXMania.D3DXDLL + " is not found." + newLine + "Please execute DXSETUP.exe in \"DirectX Redist\" folder, to install DirectX runtimes required for DTXMania.",\r
                                        true\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\bass.dll",\r
                                        "bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "baas.dll is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\Bass.Net.dll",\r
                                        "Bass.Net.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "Bass.Net.dll is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\bassmix.dll",\r
                                        "bassmix.dll を読み込めません。bassmix.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "bassmix.dll is not loaded. bassmix.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\bassasio.dll",\r
                                        "bassasio.dll を読み込めません。bassasio.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "bassasio.dll is not loaded. bassasio.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\basswasapi.dll",\r
                                        "basswasapi.dll を読み込めません。basswasapi.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "basswasapi.dll is not loaded. basswasapi.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\bass_fx.dll",\r
                                        "bass_fx.dll を読み込めません。bass_fx.dll か bass.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "bass_fx.dll is not loaded. bass_fx.dll or bass.dll must not exist." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                if ( !tDLLの存在チェック( "dll\\DirectShowLib-2005.dll",\r
                                        "DirectShowLib-2005.dll が存在しません。" + newLine + "DTXManiaをダウンロードしなおしてください。",\r
                                        "DirectShowLib-2005.dll is not found." + newLine + "Please download DTXMania again."\r
-                                       ) ) flag = true;\r
+                                       ) ) bDLLnotfound = true;\r
                                #endregion\r
-                               if (!flag)\r
+                               if ( !bDLLnotfound )\r
                                {\r
 #if DEBUG && TEST_ENGLISH\r
                                        Thread.CurrentThread.CurrentCulture = new CultureInfo( "en-US" );\r
 #endif\r
 \r
-                                       DWM.EnableComposition(false);   // Disable AeroGrass temporally\r
+                                       DWM.EnableComposition( false ); // Disable AeroGrass temporally\r
 \r
                                        // BEGIN #23670 2010.11.13 from: キャッチされない例外は放出せずに、ログに詳細を出力する。\r
                                        // BEGIM #24606 2011.03.08 from: DEBUG 時は例外発生箇所を直接デバッグできるようにするため、例外をキャッチしないようにする。\r
@@ -132,7 +139,7 @@ namespace DTXMania
                                        try\r
 #endif\r
                                        {\r
-                                               using( var mania = new CDTXMania() )\r
+                                               using ( var mania = new CDTXMania() )\r
                                                        mania.Run();\r
 \r
                                                Trace.WriteLine( "" );\r
@@ -151,17 +158,75 @@ namespace DTXMania
                                        // END #24606 2011.03.08 from\r
                                        // END #23670 2010.11.13 from\r
 \r
-                                       if( Trace.Listeners.Count > 1 )\r
+                                       if ( Trace.Listeners.Count > 1 )\r
                                                Trace.Listeners.RemoveAt( 1 );\r
                                }\r
 \r
                                // BEGIN #24615 2011.03.09 from: Mutex.WaitOne() が true を返した場合は、Mutex のリリースが必要である。\r
-                               \r
+\r
                                mutex二重起動防止用.ReleaseMutex();\r
                                mutex二重起動防止用 = null;\r
-                               \r
+\r
                                // END #24615 2011.03.09 from\r
                        }\r
+                       else            // DTXManiaが既に起動中\r
+                       {\r
+                               \r
+                               // → 引数が0個の時はそのまま終了\r
+                               // 1個( コンパクトモード or DTXV -S) か2個 (DTXV -Nxxx ファイル名)のときは、そのプロセスにコマンドラインを丸々投げて終了する\r
+\r
+                               #region [ 既に起動中のDTXManiaプロセスを検索する。]\r
+                               // このやり方だと、ShowInTaskbar=falseでタスクバーに表示されないパターンの時に検索に失敗するようだが\r
+                               // DTXManiaでそのパターンはない?のでこのままいく。\r
+                               // FindWindowを使えばこのパターンにも対応できるが、C#でビルドするアプリはウインドウクラス名を自前指定できないので、これは使わない。\r
+\r
+                               Process current = Process.GetCurrentProcess();\r
+                               Process[] running = Process.GetProcessesByName( current.ProcessName );\r
+                               Process target = null;\r
+                               //IntPtr hWnd = FindWindow( null, "DTXMania .NET style release " + CDTXMania.VERSION );\r
+\r
+                               foreach ( Process p in running )\r
+                               {\r
+                                       if ( p.Id != current.Id )       // プロセス名は同じでかつ、プロセスIDが自分自身とは異なるものを探す\r
+                                       {\r
+                                               if ( p.MainModule.FileName == current.MainModule.FileName )\r
+                                               {\r
+                                                       target = p;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               #endregion\r
+\r
+                               #region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]\r
+                               if ( target != null )\r
+                               {\r
+                                       string[] commandLineArgs = Environment.GetCommandLineArgs();\r
+                                       if ( commandLineArgs != null && commandLineArgs.Length > 1 )\r
+                                       {\r
+                                               string arg = null;\r
+                                               for ( int i = 1; i < commandLineArgs.Length; i++ )\r
+                                               {\r
+                                                       if ( i == 1 )\r
+                                                       {\r
+                                                               arg += commandLineArgs[ i ];\r
+                                                       }\r
+                                                       else\r
+                                                       {\r
+                                                               arg += " " + "\"" + commandLineArgs[ i ] + "\"";\r
+                                                       }\r
+                                               }\r
+\r
+//Debug.WriteLine( "Message=" + arg );\r
+\r
+                                               if ( arg != null )\r
+                                               {\r
+                                                       FDK.CSendMessage.sendmessage( target.MainWindowHandle, current.MainWindowHandle, arg );\r
+                                               }\r
+                                       }\r
+                               }\r
+                               #endregion\r
+                       }\r
                }\r
        }\r
 }\r
index a43dfa0..7792ae4 100644 (file)
@@ -3,7 +3,7 @@
   <PropertyGroup>\r
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>\r
-    <ProductVersion>9.0.21022</ProductVersion>\r
+    <ProductVersion>9.0.30729</ProductVersion>\r
     <SchemaVersion>2.0</SchemaVersion>\r
     <ProjectGuid>{BCD40908-F3E2-4707-BFAA-1DD99DF6357D}</ProjectGuid>\r
     <OutputType>Library</OutputType>\r
@@ -63,6 +63,7 @@
   <ItemGroup>\r
     <Compile Include="コード\00.共通\COS.cs" />\r
     <Compile Include="コード\00.共通\CPowerManagement.cs" />\r
+    <Compile Include="コード\00.共通\CSendMessage.cs" />\r
     <Compile Include="コード\00.共通\CTimerBase.cs" />\r
     <Compile Include="コード\00.共通\C一定間隔処理.cs" />\r
     <Compile Include="コード\00.共通\C共通.cs" />\r
index ea9c999..338256c 100644 (file)
@@ -27,6 +27,7 @@ using System.Reflection;
 using System.Security.Permissions;\r
 using System.Windows.Forms;\r
 using System.Runtime.InteropServices;\r
+using System.Diagnostics;\r
 using SampleFramework.Properties;\r
 \r
 namespace SampleFramework\r
@@ -121,6 +122,16 @@ namespace SampleFramework
                        get;\r
                        set;\r
                }\r
+               public string strMessage                                // #28821 2014.1.23 yyagi\r
+               {\r
+                       get;\r
+                       private set;\r
+               }\r
+               public bool IsReceivedMessage\r
+               {\r
+                       get;\r
+                       set;\r
+               }\r
 \r
                private Screen m_Screen;\r
         /// <summary>\r
@@ -144,6 +155,7 @@ namespace SampleFramework
 \r
             //Icon = GetDefaultIcon();\r
             Text = GetDefaultTitle();\r
+                       strMessage = "";\r
         }\r
 \r
         /// <summary>\r
@@ -302,6 +314,8 @@ namespace SampleFramework
                }\r
                #endregion\r
 \r
+\r
+\r
                /// <summary>\r
         /// Handles raw window messages.\r
         /// </summary>\r
@@ -406,17 +420,27 @@ namespace SampleFramework
                                }\r
                                #endregion\r
                        }\r
-\r
+                       #region #28821 2014.1.23 yyagi (WM_COPYDATA)\r
+                       else if ( m.Msg == WindowConstants.WM_COPYDATA )\r
+                       {\r
+                               COPYDATASTRUCT mystr = new COPYDATASTRUCT();\r
+                               Type mytype = mystr.GetType();\r
+                               mystr = (COPYDATASTRUCT) m.GetLParam( mytype );\r
+                               strMessage = mystr.lpData;\r
+                               IsReceivedMessage = true;\r
+                       }\r
+                       #endregion\r
                        #region #23510 2010.11.16 yyagi add: 縦横比固定でのウインドウサイズ変更 from http://d.hatena.ne.jp/iselix/20080917/1221666614 http://hp.vector.co.jp/authors/VA016117/sizing.html\r
-                       else if (m.Msg == WM_SIZING)\r
+                       else if ( m.Msg == WM_SIZING )\r
                        {\r
-                               RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));\r
-                               int w = rc.Right - rc.Left - (Size.Width - ClientSize.Width);\r
-                               int h = rc.Bottom - rc.Top - (Size.Height - ClientSize.Height);\r
-                               int dw = (int)(h * widthRatio / heightRatio + 0.5) - w;\r
-                               int dh = (int)(w / (widthRatio / heightRatio) + 0.5) - h;\r
+                               RECT rc = (RECT) Marshal.PtrToStructure( m.LParam, typeof( RECT ) );\r
+                               int w = rc.Right - rc.Left - ( Size.Width - ClientSize.Width );\r
+                               int h = rc.Bottom - rc.Top - ( Size.Height - ClientSize.Height );\r
+                               int dw = (int) ( h * widthRatio / heightRatio + 0.5 ) - w;\r
+                               int dh = (int) ( w / ( widthRatio / heightRatio ) + 0.5 ) - h;\r
 \r
-                               switch (m.WParam.ToInt32()) {\r
+                               switch ( m.WParam.ToInt32() )\r
+                               {\r
                                        case WMSZ_LEFT:\r
                                        case WMSZ_RIGHT:\r
                                                rc.Bottom += dh;\r
@@ -426,7 +450,7 @@ namespace SampleFramework
                                                rc.Right += dw;\r
                                                break;\r
                                        case WMSZ_BOTTOMRIGHT:\r
-                                               if (dw > 0)\r
+                                               if ( dw > 0 )\r
                                                {\r
                                                        rc.Right += dw;\r
                                                }\r
@@ -436,7 +460,7 @@ namespace SampleFramework
                                                }\r
                                                break;\r
                                        case WMSZ_TOPLEFT:\r
-                                               if (dw > 0)\r
+                                               if ( dw > 0 )\r
                                                {\r
                                                        rc.Left -= dw;\r
                                                }\r
@@ -446,7 +470,7 @@ namespace SampleFramework
                                                }\r
                                                break;\r
                                        case WMSZ_TOPRIGHT:\r
-                                               if (dw > 0)\r
+                                               if ( dw > 0 )\r
                                                {\r
                                                        rc.Right += dw;\r
                                                }\r
@@ -456,7 +480,7 @@ namespace SampleFramework
                                                }\r
                                                break;\r
                                        case WMSZ_BOTTOMLEFT:\r
-                                               if (dw > 0)\r
+                                               if ( dw > 0 )\r
                                                {\r
                                                        rc.Left -= dw;\r
                                                }\r
@@ -468,9 +492,9 @@ namespace SampleFramework
                                        case 9:         // #32383 2013.11.2 yyagi; exitting maximized window by using Aero snap\r
                                                break;\r
                                        default:\r
-                                               throw new ArgumentOutOfRangeException("value", "Illegal WM_SIZING value.");\r
+                                               throw new ArgumentOutOfRangeException( "value", "Illegal WM_SIZING value." );\r
                                }\r
-                               Marshal.StructureToPtr(rc, m.LParam, true);\r
+                               Marshal.StructureToPtr( rc, m.LParam, true );\r
                        }\r
                        #endregion\r
 \r
index 82ed1a1..3216961 100644 (file)
@@ -60,4 +60,13 @@ namespace SampleFramework
             get { return Marshal.SizeOf(typeof(WINDOWPLACEMENT)); }\r
         }\r
     }\r
+       #region #28821 2014.1.23 yyagi add: 外部からの文字列メッセージ送受信 定数定義\r
+       [StructLayout( LayoutKind.Sequential )]\r
+       public struct COPYDATASTRUCT\r
+       {\r
+               public IntPtr dwData;\r
+               public UInt32 cbData;\r
+               public string lpData;\r
+       }\r
+       #endregion\r
 }\r
index 7b79522..6a07faa 100644 (file)
@@ -29,6 +29,7 @@ namespace SampleFramework
         public const int WM_SYSCOMMAND = 0x112;\r
         public const int WM_ACTIVATEAPP = 0x001C;\r
         public const int WM_POWERBROADCAST = 0x0218;\r
+               public const int WM_COPYDATA = 0x004A;\r
 \r
         public const int SC_SCREENSAVE = 0xF140;\r
         public const int SC_MONITORPOWER = 0xF170;\r
@@ -70,5 +71,7 @@ namespace SampleFramework
         public const uint ES_DISPLAY_REQUIRED = 0x00000002;\r
 \r
         public const int MONITOR_DEFAULTTOPRIMARY = 1;\r
-    }\r
+\r
+               public const int WM_USER = 0x400;\r
+       }\r
 }\r
index 5159109..4dcb431 100644 (file)
@@ -129,7 +129,7 @@ namespace FDK
                        if( !Bass.BASS_Init( nデバイス, n周波数, BASSInit.BASS_DEVICE_DEFAULT, IntPtr.Zero ) )\r
                                throw new Exception( string.Format( "BASS の初期化に失敗しました。(BASS_Init)[{0}]", Bass.BASS_ErrorGetCode().ToString() ) );\r
 \r
-Debug.WriteLine( "BASS_Init()完了。" );\r
+//Debug.WriteLine( "BASS_Init()完了。" );\r
                        #region [ デバッグ用: ASIOデバイスのenumerateと、ログ出力 ]\r
 //                     CEnumerateAllAsioDevices.GetAllASIODevices();\r
 //Debug.WriteLine( "BassAsio.BASS_ASIO_GetDeviceInfo():" );\r
index a6c5a0d..c90d53b 100644 (file)
Binary files a/実行時フォルダ(DTXCreator)/DTXCreator.exe and b/実行時フォルダ(DTXCreator)/DTXCreator.exe differ
index f8a9ad5..bc21c8f 100644 (file)
Binary files a/実行時フォルダ(DTXCreator)/dll/FDK.dll and b/実行時フォルダ(DTXCreator)/dll/FDK.dll differ
index 42495db..09a9da6 100644 (file)
Binary files a/実行時フォルダ(DTXCreator)/ja-JP/DTXCreator.resources.dll and b/実行時フォルダ(DTXCreator)/ja-JP/DTXCreator.resources.dll differ
index 018dc7f..7a8ff01 100644 (file)
Binary files a/実行時フォルダ/DTXManiaGR.exe and b/実行時フォルダ/DTXManiaGR.exe differ
index f8a9ad5..bc21c8f 100644 (file)
Binary files a/実行時フォルダ/dll/FDK.dll and b/実行時フォルダ/dll/FDK.dll differ