OSDN Git Service

DeviceConstantConverter にメソッドを実装。
[dtxmania/dtxmania.git] / FDK17プロジェクト / コード / 02.入力 / CInputKeyboard.cs
1 using System;\r
2 using System.Collections.Generic;\r
3 using System.Text;\r
4 using System.Diagnostics;\r
5 using SharpDX;\r
6 using SharpDX.DirectInput;\r
7 \r
8 using SlimDXKey = SlimDX.DirectInput.Key;\r
9 using SharpDXKey = SharpDX.DirectInput.Key;\r
10 \r
11 namespace FDK\r
12 {\r
13         public class CInputKeyboard : IInputDevice, IDisposable\r
14         {\r
15                 // コンストラクタ\r
16 \r
17                 public CInputKeyboard( IntPtr hWnd, DirectInput directInput )\r
18                 {\r
19                         this.e入力デバイス種別 = E入力デバイス種別.Keyboard;\r
20                         this.GUID = "";\r
21                         this.ID = 0;\r
22                         try\r
23                         {\r
24                                 this.devKeyboard = new Keyboard( directInput );\r
25                                 this.devKeyboard.SetCooperativeLevel( hWnd, CooperativeLevel.NoWinKey | CooperativeLevel.Foreground | CooperativeLevel.NonExclusive );\r
26                                 this.devKeyboard.Properties.BufferSize = 32;\r
27                                 Trace.TraceInformation( this.devKeyboard.Information.ProductName + " を生成しました。" );\r
28                         }\r
29                         catch\r
30                         {\r
31                                 if( this.devKeyboard != null )\r
32                                 {\r
33                                         this.devKeyboard.Dispose();\r
34                                         this.devKeyboard = null;\r
35                                 }\r
36                                 Trace.TraceWarning( "Keyboard デバイスの生成に失敗しました。" );\r
37                                 throw;\r
38                         }\r
39                         try\r
40                         {\r
41                                 this.devKeyboard.Acquire();\r
42                         }\r
43                         catch\r
44                         {\r
45                         }\r
46 \r
47                         for( int i = 0; i < this.bKeyState.Length; i++ )\r
48                                 this.bKeyState[ i ] = false;\r
49 \r
50                         //this.timer = new CTimer( CTimer.E種別.MultiMedia );\r
51                         this.list入力イベント = new List<STInputEvent>( 32 );\r
52                         // this.ct = new CTimer( CTimer.E種別.PerformanceCounter );\r
53                 }\r
54 \r
55 \r
56                 // メソッド\r
57 \r
58                 #region [ IInputDevice 実装 ]\r
59                 //-----------------\r
60                 public E入力デバイス種別 e入力デバイス種別 { get; private set; }\r
61                 public string GUID { get; private set; }\r
62                 public int ID { get; private set; }\r
63                 public List<STInputEvent> list入力イベント { get; private set; }\r
64 \r
65                 public void tポーリング( bool bWindowがアクティブ中, bool bバッファ入力を使用する )\r
66                 {\r
67                         for ( int i = 0; i < 256; i++ )\r
68                         {\r
69                                 this.bKeyPushDown[ i ] = false;\r
70                                 this.bKeyPullUp[ i ] = false;\r
71                         }\r
72 \r
73                         if ( bWindowがアクティブ中 && ( this.devKeyboard != null ) )\r
74                         {\r
75                                 this.devKeyboard.Acquire();\r
76                                 this.devKeyboard.Poll();\r
77 \r
78                                 //this.list入力イベント = new List<STInputEvent>( 32 );\r
79                                 this.list入力イベント.Clear();                    // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();\r
80                                 int posEnter = -1;\r
81                                 //string d = DateTime.Now.ToString( "yyyy/MM/dd HH:mm:ss.ffff" );\r
82 \r
83                                 if ( bバッファ入力を使用する )\r
84                                 {\r
85                                         #region [ a.バッファ入力 ]\r
86                                         //-----------------------------\r
87                                         var bufferedData = this.devKeyboard.GetBufferedData();\r
88                                         //if ( Result.Last.IsSuccess && bufferedData != null )\r
89                                         {\r
90                                                 foreach ( KeyboardUpdate data in bufferedData )\r
91                                                 {\r
92                                                         //foreach ( Key key in data.PressedKeys )\r
93                                                         if( data.IsPressed )\r
94                                                         {\r
95                                                                 var key = data.Key;\r
96                                                                 // #23708 2016.3.19 yyagi; Even if we remove ALT+ENTER key input by SuppressKeyPress = true in Form,\r
97                                                                 // it doesn't affect to DirectInput (ALT+ENTER does not remove)\r
98                                                                 // So we ignore ENTER input in ALT+ENTER combination here.\r
99                                                                 // Note: ENTER will be alived if you keyup ALT after ALT+ENTER.\r
100                                                                 if( key != Key.Return || ( bKeyState[ (int)Key.LeftAlt ] == false && bKeyState[ (int)Key.RightAlt ] == false ) )\r
101                                                                 {\r
102                                                                         STInputEvent item = new STInputEvent()\r
103                                                                         {\r
104                                                                                 nKey = (int) key,\r
105                                                                                 b押された = true,\r
106                                                                                 b離された = false,\r
107                                                                                 nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
108                                                                                 nVelocity = CInput管理.n通常音量\r
109                                                                         };\r
110                                                                         this.list入力イベント.Add( item );\r
111 \r
112                                                                         this.bKeyState[ (int) key ] = true;\r
113                                                                         this.bKeyPushDown[ (int) key ] = true;\r
114                                                                 }\r
115                                                                 //if ( item.nKey == (int) SharpDX.DirectInput.Key.Space )\r
116                                                                 //{\r
117                                                                 //    Trace.TraceInformation( "FDK(buffered): SPACE key registered. " + ct.nシステム時刻 );\r
118                                                                 //}\r
119                                                         }\r
120                                                         //foreach ( Key key in data.ReleasedKeys )\r
121                                                         if( data.IsReleased )\r
122                                                         {\r
123                                                                 var key = data.Key;\r
124                                                                 STInputEvent item = new STInputEvent()\r
125                                                                 {\r
126                                                                         nKey = (int) key,\r
127                                                                         b押された = false,\r
128                                                                         b離された = true,\r
129                                                                         nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
130                                                                         nVelocity = CInput管理.n通常音量\r
131                                                                 };\r
132                                                                 this.list入力イベント.Add( item );\r
133 \r
134                                                                 this.bKeyState[ (int) key ] = false;\r
135                                                                 this.bKeyPullUp[ (int) key ] = true;\r
136                                                         }\r
137                                                 }\r
138                                         }\r
139                                         //-----------------------------\r
140                                         #endregion\r
141                                 }\r
142                                 else\r
143                                 {\r
144                                         #region [ b.状態入力 ]\r
145                                         //-----------------------------\r
146                                         KeyboardState currentState = this.devKeyboard.GetCurrentState();\r
147                                         //if ( Result.Last.IsSuccess && currentState != null )\r
148                                         {\r
149                                                 foreach ( Key key in currentState.PressedKeys )\r
150                                                 {\r
151                                                         if ( this.bKeyState[ (int) key ] == false )\r
152                                                         {\r
153                                                                 if ( key != Key.Return || ( bKeyState[ (int) Key.LeftAlt ] == false && bKeyState[ (int) Key.RightAlt ] == false ) )     // #23708 2016.3.19 yyagi\r
154                                                                 {\r
155                                                                         var ev = new STInputEvent()\r
156                                                                         {\r
157                                                                                 nKey = (int) key,\r
158                                                                                 b押された = true,\r
159                                                                                 b離された = false,\r
160                                                                                 nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻,     // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。\r
161                                                                                 nVelocity = CInput管理.n通常音量,\r
162                                                                         };\r
163                                                                         this.list入力イベント.Add( ev );\r
164 \r
165                                                                         this.bKeyState[ (int) key ] = true;\r
166                                                                         this.bKeyPushDown[ (int) key ] = true;\r
167                                                                 }\r
168 \r
169                                                                 //if ( (int) key == (int) SharpDX.DirectInput.Key.Space )\r
170                                                                 //{\r
171                                                                 //    Trace.TraceInformation( "FDK(direct): SPACE key registered. " + ct.nシステム時刻 );\r
172                                                                 //}\r
173                                                         }\r
174                                                 }\r
175                                                 //foreach ( Key key in currentState.ReleasedKeys )\r
176                                                 foreach( Key key in currentState.AllKeys )\r
177                                                 {\r
178                                                         if( this.bKeyState[ (int) key ] == true && !currentState.IsPressed( key ) ) // 前回は押されているのに今回は押されていない → 離された\r
179                                                         {\r
180                                                                 var ev = new STInputEvent() {\r
181                                                                         nKey = (int) key,\r
182                                                                         b押された = false,\r
183                                                                         b離された = true,\r
184                                                                         nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻, // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。\r
185                                                                         nVelocity = CInput管理.n通常音量,\r
186                                                                 };\r
187                                                                 this.list入力イベント.Add( ev );\r
188 \r
189                                                                 this.bKeyState[ (int) key ] = false;\r
190                                                                 this.bKeyPullUp[ (int) key ] = true;\r
191                                                         }\r
192                                                 }\r
193                                         }\r
194                                         //-----------------------------\r
195                                         #endregion\r
196                                 }\r
197                                 #region [#23708 2011.4.8 yyagi Altが押されているときは、Enter押下情報を削除する -> 副作用が見つかり削除]\r
198                                 //if ( this.bKeyState[ (int) SharpDX.DirectInput.Key.RightAlt ] ||\r
199                                 //     this.bKeyState[ (int) SharpDX.DirectInput.Key.LeftAlt ] )\r
200                                 //{\r
201                                 //    int cr = (int) SharpDX.DirectInput.Key.Return;\r
202                                 //    this.bKeyPushDown[ cr ] = false;\r
203                                 //    this.bKeyPullUp[ cr ] = false;\r
204                                 //    this.bKeyState[ cr ] = false;\r
205                                 //}\r
206                                 #endregion\r
207                         }\r
208                 }\r
209                 public bool bキーが押された( int nKey )\r
210                 {\r
211                         return this.bKeyPushDown[ nKey ];\r
212                 }\r
213                 public bool bキーが押されている( int nKey )\r
214                 {\r
215                         return this.bKeyState[ nKey ];\r
216                 }\r
217                 public bool bキーが離された( int nKey )\r
218                 {\r
219                         return this.bKeyPullUp[ nKey ];\r
220                 }\r
221                 public bool bキーが離されている( int nKey )\r
222                 {\r
223                         return !this.bKeyState[ nKey ];\r
224                 }\r
225                 //-----------------\r
226                 #endregion\r
227 \r
228                 #region [ IDisposable 実装 ]\r
229                 //-----------------\r
230                 public void Dispose()\r
231                 {\r
232                         if( !this.bDispose完了済み )\r
233                         {\r
234                                 if( this.devKeyboard != null )\r
235                                 {\r
236                                         this.devKeyboard.Dispose();\r
237                                         this.devKeyboard = null;\r
238                                 }\r
239                                 //if( this.timer != null )\r
240                                 //{\r
241                                 //    this.timer.Dispose();\r
242                                 //    this.timer = null;\r
243                                 //}\r
244                                 if ( this.list入力イベント != null )\r
245                                 {\r
246                                         this.list入力イベント = null;\r
247                                 }\r
248                                 this.bDispose完了済み = true;\r
249                         }\r
250                 }\r
251                 //-----------------\r
252                 #endregion\r
253 \r
254 \r
255                 // その他\r
256 \r
257                 #region [ private ]\r
258                 //-----------------\r
259                 private bool bDispose完了済み;\r
260                 private bool[] bKeyPullUp = new bool[ 0x100 ];\r
261                 private bool[] bKeyPushDown = new bool[ 0x100 ];\r
262                 private bool[] bKeyState = new bool[ 0x100 ];\r
263                 private Keyboard devKeyboard;\r
264                 //private CTimer timer;\r
265                 //private CTimer ct;\r
266                 //-----------------\r
267                 #endregion\r
268         }\r
269 }\r