2 using System.Collections.Generic;
\r
4 using System.Diagnostics;
\r
6 using SharpDX.DirectInput;
\r
8 using SlimDXKey = SlimDX.DirectInput.Key;
\r
9 using SharpDXKey = SharpDX.DirectInput.Key;
\r
13 public class CInputKeyboard : IInputDevice, IDisposable
\r
17 public CInputKeyboard( IntPtr hWnd, DirectInput directInput )
\r
19 this.e入力デバイス種別 = E入力デバイス種別.Keyboard;
\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
31 if( this.devKeyboard != null )
\r
33 this.devKeyboard.Dispose();
\r
34 this.devKeyboard = null;
\r
36 Trace.TraceWarning( "Keyboard デバイスの生成に失敗しました。" );
\r
41 this.devKeyboard.Acquire();
\r
47 for( int i = 0; i < this.bKeyState.Length; i++ )
\r
48 this.bKeyState[ i ] = false;
\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
58 #region [ IInputDevice 実装 ]
\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
65 public void tポーリング( bool bWindowがアクティブ中, bool bバッファ入力を使用する )
\r
67 for ( int i = 0; i < 256; i++ )
\r
69 this.bKeyPushDown[ i ] = false;
\r
70 this.bKeyPullUp[ i ] = false;
\r
73 if ( bWindowがアクティブ中 && ( this.devKeyboard != null ) )
\r
75 this.devKeyboard.Acquire();
\r
76 this.devKeyboard.Poll();
\r
78 //this.list入力イベント = new List<STInputEvent>( 32 );
\r
79 this.list入力イベント.Clear(); // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();
\r
81 //string d = DateTime.Now.ToString( "yyyy/MM/dd HH:mm:ss.ffff" );
\r
85 #region [ a.バッファ入力 ]
\r
86 //-----------------------------
\r
87 var bufferedData = this.devKeyboard.GetBufferedData();
\r
88 //if ( Result.Last.IsSuccess && bufferedData != null )
\r
90 foreach ( KeyboardUpdate data in bufferedData )
\r
92 //foreach ( Key key in data.PressedKeys )
\r
93 if( data.IsPressed )
\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
102 STInputEvent item = new STInputEvent()
\r
107 nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),
\r
108 nVelocity = CInput管理.n通常音量
\r
110 this.list入力イベント.Add( item );
\r
112 this.bKeyState[ (int) key ] = true;
\r
113 this.bKeyPushDown[ (int) key ] = true;
\r
115 //if ( item.nKey == (int) SharpDX.DirectInput.Key.Space )
\r
117 // Trace.TraceInformation( "FDK(buffered): SPACE key registered. " + ct.nシステム時刻 );
\r
120 //foreach ( Key key in data.ReleasedKeys )
\r
121 if( data.IsReleased )
\r
123 var key = data.Key;
\r
124 STInputEvent item = new STInputEvent()
\r
129 nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),
\r
130 nVelocity = CInput管理.n通常音量
\r
132 this.list入力イベント.Add( item );
\r
134 this.bKeyState[ (int) key ] = false;
\r
135 this.bKeyPullUp[ (int) key ] = true;
\r
139 //-----------------------------
\r
145 //-----------------------------
\r
146 KeyboardState currentState = this.devKeyboard.GetCurrentState();
\r
147 //if ( Result.Last.IsSuccess && currentState != null )
\r
149 foreach ( Key key in currentState.PressedKeys )
\r
151 if ( this.bKeyState[ (int) key ] == false )
\r
153 if ( key != Key.Return || ( bKeyState[ (int) Key.LeftAlt ] == false && bKeyState[ (int) Key.RightAlt ] == false ) ) // #23708 2016.3.19 yyagi
\r
155 var ev = new STInputEvent()
\r
160 nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻, // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
\r
161 nVelocity = CInput管理.n通常音量,
\r
163 this.list入力イベント.Add( ev );
\r
165 this.bKeyState[ (int) key ] = true;
\r
166 this.bKeyPushDown[ (int) key ] = true;
\r
169 //if ( (int) key == (int) SharpDX.DirectInput.Key.Space )
\r
171 // Trace.TraceInformation( "FDK(direct): SPACE key registered. " + ct.nシステム時刻 );
\r
175 //foreach ( Key key in currentState.ReleasedKeys )
\r
176 foreach( Key key in currentState.AllKeys )
\r
178 if( this.bKeyState[ (int) key ] == true && !currentState.IsPressed( key ) ) // 前回は押されているのに今回は押されていない → 離された
\r
180 var ev = new STInputEvent() {
\r
184 nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻, // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。
\r
185 nVelocity = CInput管理.n通常音量,
\r
187 this.list入力イベント.Add( ev );
\r
189 this.bKeyState[ (int) key ] = false;
\r
190 this.bKeyPullUp[ (int) key ] = true;
\r
194 //-----------------------------
\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
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
209 public bool bキーが押された( int nKey )
\r
211 return this.bKeyPushDown[ nKey ];
\r
213 public bool bキーが押されている( int nKey )
\r
215 return this.bKeyState[ nKey ];
\r
217 public bool bキーが離された( int nKey )
\r
219 return this.bKeyPullUp[ nKey ];
\r
221 public bool bキーが離されている( int nKey )
\r
223 return !this.bKeyState[ nKey ];
\r
225 //-----------------
\r
228 #region [ IDisposable 実装 ]
\r
229 //-----------------
\r
230 public void Dispose()
\r
232 if( !this.bDispose完了済み )
\r
234 if( this.devKeyboard != null )
\r
236 this.devKeyboard.Dispose();
\r
237 this.devKeyboard = null;
\r
239 //if( this.timer != null )
\r
241 // this.timer.Dispose();
\r
242 // this.timer = null;
\r
244 if ( this.list入力イベント != null )
\r
246 this.list入力イベント = null;
\r
248 this.bDispose完了済み = true;
\r
251 //-----------------
\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