+++ /dev/null
-using System;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-using System.Diagnostics;\r
-using SharpDX;\r
-using SharpDX.DirectInput;\r
-\r
-using SlimDXKey = SlimDX.DirectInput.Key;\r
-using SharpDXKey = SharpDX.DirectInput.Key;\r
-\r
-namespace FDK\r
-{\r
- public class CInputKeyboard : IInputDevice, IDisposable\r
- {\r
- // コンストラクタ\r
-\r
- public CInputKeyboard( IntPtr hWnd, DirectInput directInput )\r
- {\r
- this.e入力デバイス種別 = E入力デバイス種別.Keyboard;\r
- this.GUID = "";\r
- this.ID = 0;\r
- try\r
- {\r
- this.devKeyboard = new Keyboard( directInput );\r
- this.devKeyboard.SetCooperativeLevel( hWnd, CooperativeLevel.NoWinKey | CooperativeLevel.Foreground | CooperativeLevel.NonExclusive );\r
- this.devKeyboard.Properties.BufferSize = 32;\r
- Trace.TraceInformation( this.devKeyboard.Information.ProductName + " を生成しました。" );\r
- }\r
- catch\r
- {\r
- if( this.devKeyboard != null )\r
- {\r
- this.devKeyboard.Dispose();\r
- this.devKeyboard = null;\r
- }\r
- Trace.TraceWarning( "Keyboard デバイスの生成に失敗しました。" );\r
- throw;\r
- }\r
- try\r
- {\r
- this.devKeyboard.Acquire();\r
- }\r
- catch\r
- {\r
- }\r
-\r
- for( int i = 0; i < this.bKeyState.Length; i++ )\r
- this.bKeyState[ i ] = false;\r
-\r
- //this.timer = new CTimer( CTimer.E種別.MultiMedia );\r
- this.list入力イベント = new List<STInputEvent>( 32 );\r
- // this.ct = new CTimer( CTimer.E種別.PerformanceCounter );\r
- }\r
-\r
-\r
- // メソッド\r
-\r
- #region [ IInputDevice 実装 ]\r
- //-----------------\r
- public E入力デバイス種別 e入力デバイス種別 { get; private set; }\r
- public string GUID { get; private set; }\r
- public int ID { get; private set; }\r
- public List<STInputEvent> list入力イベント { get; private set; }\r
-\r
- public void tポーリング( bool bWindowがアクティブ中, bool bバッファ入力を使用する )\r
- {\r
- for ( int i = 0; i < 256; i++ )\r
- {\r
- this.bKeyPushDown[ i ] = false;\r
- this.bKeyPullUp[ i ] = false;\r
- }\r
-\r
- if ( bWindowがアクティブ中 && ( this.devKeyboard != null ) )\r
- {\r
- this.devKeyboard.Acquire();\r
- this.devKeyboard.Poll();\r
-\r
- //this.list入力イベント = new List<STInputEvent>( 32 );\r
- this.list入力イベント.Clear(); // #xxxxx 2012.6.11 yyagi; To optimize, I removed new();\r
- int posEnter = -1;\r
- //string d = DateTime.Now.ToString( "yyyy/MM/dd HH:mm:ss.ffff" );\r
-\r
- if ( bバッファ入力を使用する )\r
- {\r
- #region [ a.バッファ入力 ]\r
- //-----------------------------\r
- var bufferedData = this.devKeyboard.GetBufferedData();\r
- //if ( Result.Last.IsSuccess && bufferedData != null )\r
- {\r
- foreach( KeyboardUpdate data in bufferedData )\r
- {\r
- // #xxxxx: 2017.5.7: from: DIK (SharpDX.DirectInput.Key) を SlimDX.DirectInput.Key に変換。\r
- var key = DeviceConstantConverter.DIKtoKey( data.Key );\r
- if( SlimDXKey.Unknown == key )\r
- continue; // 未対応キーは無視。\r
-\r
- //foreach ( Key key in data.PressedKeys )\r
- if( data.IsPressed )\r
- {\r
- // #23708 2016.3.19 yyagi; Even if we remove ALT+ENTER key input by SuppressKeyPress = true in Form,\r
- // it doesn't affect to DirectInput (ALT+ENTER does not remove)\r
- // So we ignore ENTER input in ALT+ENTER combination here.\r
- // Note: ENTER will be alived if you keyup ALT after ALT+ENTER.\r
- if( key != SlimDXKey.Return || ( bKeyState[ (int) SlimDXKey.LeftAlt ] == false && bKeyState[ (int) SlimDXKey.RightAlt ] == false ) )\r
- {\r
- STInputEvent item = new STInputEvent() {\r
- nKey = (int) key,\r
- b押された = true,\r
- b離された = false,\r
- nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
- nVelocity = CInput管理.n通常音量\r
- };\r
- this.list入力イベント.Add( item );\r
-\r
- this.bKeyState[ (int) key ] = true;\r
- this.bKeyPushDown[ (int) key ] = true;\r
- }\r
- //if ( item.nKey == (int) SlimDXKey.Space )\r
- //{\r
- // Trace.TraceInformation( "FDK(buffered): SPACE key registered. " + ct.nシステム時刻 );\r
- //}\r
- }\r
- //foreach ( Key key in data.ReleasedKeys )\r
- if( data.IsReleased )\r
- {\r
- STInputEvent item = new STInputEvent() {\r
- nKey = (int) key,\r
- b押された = false,\r
- b離された = true,\r
- nTimeStamp = CSound管理.rc演奏用タイマ.nサウンドタイマーのシステム時刻msへの変換( data.Timestamp ),\r
- nVelocity = CInput管理.n通常音量\r
- };\r
- this.list入力イベント.Add( item );\r
-\r
- this.bKeyState[ (int) key ] = false;\r
- this.bKeyPullUp[ (int) key ] = true;\r
- }\r
- }\r
- }\r
- //-----------------------------\r
- #endregion\r
- }\r
- else\r
- {\r
- #region [ b.状態入力 ]\r
- //-----------------------------\r
- KeyboardState currentState = this.devKeyboard.GetCurrentState();\r
- //if ( Result.Last.IsSuccess && currentState != null )\r
- {\r
- foreach( SharpDXKey dik in currentState.PressedKeys )\r
- {\r
- // #xxxxx: 2017.5.7: from: DIK (SharpDX.DirectInput.Key) を SlimDX.DirectInput.Key に変換。\r
- var key = DeviceConstantConverter.DIKtoKey( dik );\r
- if( SlimDXKey.Unknown == key )\r
- continue; // 未対応キーは無視。\r
-\r
- if( this.bKeyState[ (int) key ] == false )\r
- {\r
- if( key != SlimDXKey.Return || ( bKeyState[ (int) SlimDXKey.LeftAlt ] == false && bKeyState[ (int) SlimDXKey.RightAlt ] == false ) ) // #23708 2016.3.19 yyagi\r
- {\r
- var ev = new STInputEvent() {\r
- nKey = (int) key,\r
- b押された = true,\r
- b離された = false,\r
- nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻, // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。\r
- nVelocity = CInput管理.n通常音量,\r
- };\r
- this.list入力イベント.Add( ev );\r
-\r
- this.bKeyState[ (int) key ] = true;\r
- this.bKeyPushDown[ (int) key ] = true;\r
- }\r
-\r
- //if ( (int) key == (int) SlimDXKey.Space )\r
- //{\r
- // Trace.TraceInformation( "FDK(direct): SPACE key registered. " + ct.nシステム時刻 );\r
- //}\r
- }\r
- }\r
- //foreach ( Key key in currentState.ReleasedKeys )\r
- foreach( SharpDXKey dik in currentState.AllKeys )\r
- {\r
- // #xxxxx: 2017.5.7: from: DIK (SharpDX.DirectInput.Key) を SlimDX.DirectInput.Key に変換。\r
- var key = DeviceConstantConverter.DIKtoKey( dik );\r
- if( SlimDXKey.Unknown == key )\r
- continue; // 未対応キーは無視。\r
-\r
- if( this.bKeyState[ (int) key ] == true && !currentState.IsPressed( dik ) ) // 前回は押されているのに今回は押されていない → 離された\r
- {\r
- var ev = new STInputEvent() {\r
- nKey = (int) key,\r
- b押された = false,\r
- b離された = true,\r
- nTimeStamp = CSound管理.rc演奏用タイマ.nシステム時刻, // 演奏用タイマと同じタイマを使うことで、BGMと譜面、入力ずれを防ぐ。\r
- nVelocity = CInput管理.n通常音量,\r
- };\r
- this.list入力イベント.Add( ev );\r
-\r
- this.bKeyState[ (int) key ] = false;\r
- this.bKeyPullUp[ (int) key ] = true;\r
- }\r
- }\r
- }\r
- //-----------------------------\r
- #endregion\r
- }\r
- #region [#23708 2011.4.8 yyagi Altが押されているときは、Enter押下情報を削除する -> 副作用が見つかり削除]\r
- //if ( this.bKeyState[ (int) SlimDXKey.RightAlt ] ||\r
- // this.bKeyState[ (int) SlimDXKey.LeftAlt ] )\r
- //{\r
- // int cr = (int) SlimDXKey.Return;\r
- // this.bKeyPushDown[ cr ] = false;\r
- // this.bKeyPullUp[ cr ] = false;\r
- // this.bKeyState[ cr ] = false;\r
- //}\r
- #endregion\r
- }\r
- }\r
-\r
- /// <param name="nKey">\r
- /// 調べる SlimDX.DirectInput.Key を int にキャストした値。(SharpDX.DirectInput.Key ではないので注意。)\r
- /// </param>\r
- public bool bキーが押された( int nKey )\r
- {\r
- return this.bKeyPushDown[ nKey ];\r
- }\r
-\r
- /// <param name="nKey">\r
- /// 調べる SlimDX.DirectInput.Key を int にキャストした値。(SharpDX.DirectInput.Key ではないので注意。)\r
- /// </param>\r
- public bool bキーが押されている( int nKey )\r
- {\r
- return this.bKeyState[ nKey ];\r
- }\r
-\r
- /// <param name="nKey">\r
- /// 調べる SlimDX.DirectInput.Key を int にキャストした値。(SharpDX.DirectInput.Key ではないので注意。)\r
- /// </param>\r
- public bool bキーが離された( int nKey )\r
- {\r
- return this.bKeyPullUp[ nKey ];\r
- }\r
-\r
- /// <param name="nKey">\r
- /// 調べる SlimDX.DirectInput.Key を int にキャストした値。(SharpDX.DirectInput.Key ではないので注意。)\r
- /// </param>\r
- public bool bキーが離されている( int nKey )\r
- {\r
- return !this.bKeyState[ nKey ];\r
- }\r
- //-----------------\r
- #endregion\r
-\r
- #region [ IDisposable 実装 ]\r
- //-----------------\r
- public void Dispose()\r
- {\r
- if( !this.bDispose完了済み )\r
- {\r
- if( this.devKeyboard != null )\r
- {\r
- this.devKeyboard.Dispose();\r
- this.devKeyboard = null;\r
- }\r
- //if( this.timer != null )\r
- //{\r
- // this.timer.Dispose();\r
- // this.timer = null;\r
- //}\r
- if ( this.list入力イベント != null )\r
- {\r
- this.list入力イベント = null;\r
- }\r
- this.bDispose完了済み = true;\r
- }\r
- }\r
- //-----------------\r
- #endregion\r
-\r
-\r
- // その他\r
-\r
- #region [ private ]\r
- //-----------------\r
- private bool bDispose完了済み;\r
- private bool[] bKeyPullUp = new bool[ 256 ];\r
- private bool[] bKeyPushDown = new bool[ 256 ];\r
- private bool[] bKeyState = new bool[ 256 ];\r
- private Keyboard devKeyboard;\r
- //private CTimer timer;\r
- //private CTimer ct;\r
- //-----------------\r
- #endregion\r
- }\r
-}\r