diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
index 112e0c1c..27d9e50a 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/AppSettings/KeyMapperSetting/KeyMapperSetting.cs
@@ -232,7 +232,7 @@ namespace AxibugEmuOnline.Client.Settings
             else return totalFloat / totalControl;
         }
 
-        public class MapSetting : Dictionary<T, List<InputControl_D>> { }
+        public class MapSetting : Dictionary<T, List<InputControl_C>> { }
 
         public class BindingPage
         {
@@ -277,7 +277,7 @@ namespace AxibugEmuOnline.Client.Settings
                 m_mapSetting.Remove(device);
             }
 
-            public void SetBinding(T emuBtn, InputControl_D key, int settingSlot)
+            public void SetBinding(T emuBtn, InputControl_C key, int settingSlot)
             {
                 var device = key.Device;
                 m_registedDevices.TryGetValue(device.GetType(), out var inputDevice);
@@ -287,7 +287,7 @@ namespace AxibugEmuOnline.Client.Settings
                 var setting = m_mapSetting[inputDevice];
                 if (!setting.TryGetValue(emuBtn, out var settingList))
                 {
-                    settingList = new List<InputControl_D>();
+                    settingList = new List<InputControl_C>();
                     setting[emuBtn] = settingList;
                 }
 
@@ -297,7 +297,7 @@ namespace AxibugEmuOnline.Client.Settings
                 settingList[settingSlot] = key;
             }
 
-            public InputControl_D GetBinding(T emuBtn, InputDevice_D device, int settingSlot)
+            public InputControl_C GetBinding(T emuBtn, InputDevice_D device, int settingSlot)
             {
                 m_mapSetting.TryGetValue(device, out var mapSetting);
                 if (mapSetting == null) return null;
@@ -308,8 +308,8 @@ namespace AxibugEmuOnline.Client.Settings
                 return settingList[settingSlot];
             }
 
-            private List<InputControl_D> m_caches = new List<InputControl_D>();
-            public IEnumerable<InputControl_D> GetBinding(T emuBtn)
+            private List<InputControl_C> m_caches = new List<InputControl_C>();
+            public IEnumerable<InputControl_C> GetBinding(T emuBtn)
             {
                 m_caches.Clear();
 
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/GamePad_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/GamePad_D.cs
index 6bb15a6d..9792afa8 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/GamePad_D.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/GamePad_D.cs
@@ -1,34 +1,29 @@
-using System.Collections.Generic;
-
-namespace AxibugEmuOnline.Client.InputDevices
+namespace AxibugEmuOnline.Client.InputDevices
 {
     /// <summary>
     /// 通用游戏控制器
     /// </summary>
     public class GamePad_D : InputDevice_D
     {
-        public Button_C Up { get; private set; }
-        public Button_C Down { get; private set; }
-        public Button_C Left { get; private set; }
-        public Button_C Right { get; private set; }
-        public Button_C Option { get; private set; }
-        public Button_C Start { get; private set; }
-        public Button_C North { get; private set; }
-        public Button_C South { get; private set; }
-        public Button_C West { get; private set; }
-        public Button_C East { get; private set; }
-        public Button_C LeftShoulder { get; private set; }
-        public Button_C RightShoulder { get; private set; }
-        public Button_C LeftTrigger { get; private set; }
-        public Button_C RightTrigger { get; private set; }
+        public Button_C Up;
+        public Button_C Down;
+        public Button_C Left;
+        public Button_C Right;
+        public Button_C Option;
+        public Button_C Start;
+        public Button_C North;
+        public Button_C South;
+        public Button_C West;
+        public Button_C East;
+        public Button_C LeftShoulder;
+        public Button_C RightShoulder;
+        public Button_C LeftTrigger;
+        public Button_C RightTrigger;
+        public Button_C LeftStickPress;
+        public Button_C RightStickPress;
+        public Stick_C LeftStick;
+        public Stick_C RightStick;
 
         public GamePad_D(InputResolver resolver) : base(resolver) { }
-
-        protected override List<InputControl_D> DefineControls()
-        {
-            throw new System.NotImplementedException();
-        }
-
-
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Button_C.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Button_C.cs
index 521d34ec..3eaaa7bd 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Button_C.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Button_C.cs
@@ -3,15 +3,10 @@
     /// <summary>
     /// 按键类型的输入控件
     /// </summary>
-    public class Button_C : InputControl_D
+    public class Button_C : InputControl_C
     {
-        string m_controlName;
-
-        public Button_C(InputDevice_D device, string controlName) : base(device)
+        public Button_C(InputDevice_D device, string controlName) : base(device, controlName)
         {
-            m_controlName = controlName;
         }
-
-        public override string ControlName => m_controlName;
     }
 }
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_C.cs
similarity index 56%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_D.cs
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_C.cs
index bcd70e18..ad1a5059 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_D.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_C.cs
@@ -1,11 +1,14 @@
-using UnityEngine;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using UnityEngine;
 
 namespace AxibugEmuOnline.Client.InputDevices
 {
     /// <summary>
     /// 输入设备的抽象控件接口
     /// </summary>
-    public abstract class InputControl_D
+    public abstract class InputControl_C
     {
         /// <summary> 控件所属设备 </summary>
         public InputDevice_D Device { get; internal set; }
@@ -30,7 +33,6 @@ namespace AxibugEmuOnline.Client.InputDevices
             UpdateReleaseStartState();
             OnUpdate();
         }
-
         private void UpdateReleaseStartState()
         {
             var oldPerforming = m_performingLastFrame;
@@ -48,12 +50,42 @@ namespace AxibugEmuOnline.Client.InputDevices
 
         protected virtual void OnUpdate() { }
 
+        public InputControl_C Parent { get; private set; }
         /// <summary> 控件名,这个控件名称必须是唯一的 </summary>
-        public abstract string ControlName { get; }
-
-        internal InputControl_D(InputDevice_D device)
+        public string ControlName { get; private set; }
+        protected Dictionary<string, InputControl_C> m_controlMapper = new Dictionary<string, InputControl_C>();
+        internal InputControl_C(InputDevice_D device, string controlName)
         {
             Device = device;
+            ControlName = controlName;
+
+            DefineControls();
+        }
+
+        private void DefineControls()
+        {
+            foreach (var field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public))
+            {
+                if (!typeof(InputControl_C).IsAssignableFrom(field.FieldType)) continue;
+
+                var controlIns = Activator.CreateInstance(field.FieldType, this, field.Name) as InputControl_C;
+                controlIns.Parent = this;
+                field.SetValue(this, controlIns);
+
+                m_controlMapper[field.Name] = controlIns;
+            }
+        }
+
+        public override string ToString()
+        {
+            if (Parent != null)
+            {
+                return $"{Parent}/{ControlName}";
+            }
+            else
+            {
+                return $"{Device}/{ControlName}";
+            }
         }
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_D.cs.meta b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_C.cs.meta
similarity index 100%
rename from AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_D.cs.meta
rename to AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/InputControl_C.cs.meta
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs
index 225da4c3..26cdf723 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputControls/Stick_C.cs
@@ -5,24 +5,15 @@ namespace AxibugEmuOnline.Client.InputDevices
     /// <summary>
     /// 摇杆类型的输入控件,支持的返回值为Vector2
     /// </summary>
-    public class Stick_C : InputControl_D
+    public class Stick_C : InputControl_C
     {
-        string m_controlName;
-        public override string ControlName => m_controlName;
+        public VirtualButton UP;
+        public VirtualButton Down;
+        public VirtualButton Left;
+        public VirtualButton Right;
 
-        public VirtualButton UP { get; private set; }
-        public VirtualButton Down { get; private set; }
-        public VirtualButton Left { get; private set; }
-        public VirtualButton Right { get; private set; }
-
-        public Stick_C(InputDevice_D device, string controlName) : base(device)
+        public Stick_C(InputDevice_D device, string controlName) : base(device, controlName)
         {
-            m_controlName = controlName;
-
-            UP = new VirtualButton(device);
-            Down = new VirtualButton(device);
-            Left = new VirtualButton(device);
-            Right = new VirtualButton(device);
         }
 
         protected override void OnUpdate()
@@ -43,11 +34,11 @@ namespace AxibugEmuOnline.Client.InputDevices
         }
 
 
-        public class VirtualButton : InputControl_D
+        public class VirtualButton : InputControl_C
         {
             internal bool m_performing;
 
-            public VirtualButton(InputDevice_D device) : base(device) { }
+            public VirtualButton(InputDevice_D device, string controlName) : base(device, controlName) { }
 
             public override bool Performing
             {
@@ -63,8 +54,6 @@ namespace AxibugEmuOnline.Client.InputDevices
             {
                 return Performing ? 1 : 0;
             }
-
-            public override string ControlName => "VirtualStickButton";
         }
     }
 }
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs
index 402df819..b7d82bea 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/InputDevice_D.cs
@@ -1,4 +1,6 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
 
 namespace AxibugEmuOnline.Client.InputDevices
 {
@@ -13,15 +15,24 @@ namespace AxibugEmuOnline.Client.InputDevices
         /// <summary> 获得输入解决器 </summary>
         internal InputResolver Resolver => m_resolver;
 
-        protected Dictionary<string, InputControl_D> m_controlMapper = new Dictionary<string, InputControl_D>();
+        protected Dictionary<string, InputControl_C> m_controlMapper = new Dictionary<string, InputControl_C>();
         protected InputResolver m_resolver;
         public InputDevice_D(InputResolver resolver)
         {
             m_resolver = resolver;
+            DefineControls();
+        }
 
-            foreach (var control in DefineControls())
+        private void DefineControls()
+        {
+            foreach (var field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public))
             {
-                m_controlMapper.Add(control.ControlName, control);
+                if (!typeof(InputControl_C).IsAssignableFrom(field.FieldType)) continue;
+
+                var controlIns = Activator.CreateInstance(field.FieldType, this, field.Name) as InputControl_C;
+                field.SetValue(this, controlIns);
+
+                m_controlMapper[field.Name] = controlIns;
             }
         }
 
@@ -39,18 +50,9 @@ namespace AxibugEmuOnline.Client.InputDevices
             }
         }
 
-        /// <summary> 用于列出这个输入设备的所有输入控件实例 </summary>
-        /// <returns></returns>
-        protected abstract List<InputControl_D> DefineControls();
-
-        /// <summary> 通过控件名称,找到对应的控件 </summary>
-        /// <param name="keyName"></param>
-        /// <returns></returns>
-        public InputControl_D FindControlByName(string controlName)
+        public override string ToString()
         {
-            m_controlMapper.TryGetValue(controlName, out var key);
-            return key;
+            return Resolver.GetDeviceName(this);
         }
-
     }
 }
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs
index 34d41b59..35a28897 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/Keyboard_D.cs
@@ -1,190 +1,116 @@
 using System.Collections.Generic;
-using System.Linq;
-using UnityEngine;
 
 namespace AxibugEmuOnline.Client.InputDevices
 {
     /// <summary>
     /// 通用键盘设备
     /// </summary>
-    public partial class Keyboard_D : InputDevice_D
+    public class Keyboard_D : InputDevice_D
     {
-        Dictionary<KeyCode, KeyboardKey> m_keyControllerMap = new Dictionary<KeyCode, KeyboardKey>();
+        public Button_C A;
+        public Button_C B;
+        public Button_C C;
+        public Button_C D;
+        public Button_C E;
+        public Button_C F;
+        public Button_C G;
+        public Button_C H;
+        public Button_C I;
+        public Button_C J;
+        public Button_C K;
+        public Button_C L;
+        public Button_C M;
+        public Button_C N;
+        public Button_C O;
+        public Button_C P;
+        public Button_C Q;
+        public Button_C R;
+        public Button_C S;
+        public Button_C T;
+        public Button_C U;
+        public Button_C V;
+        public Button_C W;
+        public Button_C X;
+        public Button_C Y;
+        public Button_C Z;
+        public Button_C Alpha0;
+        public Button_C Alpha1;
+        public Button_C Alpha2;
+        public Button_C Alpha3;
+        public Button_C Alpha4;
+        public Button_C Alpha5;
+        public Button_C Alpha6;
+        public Button_C Alpha7;
+        public Button_C Alpha8;
+        public Button_C Alpha9;
+        public Button_C F1;
+        public Button_C F2;
+        public Button_C F3;
+        public Button_C F4;
+        public Button_C F5;
+        public Button_C F6;
+        public Button_C F7;
+        public Button_C F8;
+        public Button_C F9;
+        public Button_C F10;
+        public Button_C F11;
+        public Button_C F12;
+        public Button_C UpArrow;
+        public Button_C DownArrow;
+        public Button_C LeftArrow;
+        public Button_C RightArrow;
+        public Button_C Space;
+        public Button_C Return;
+        public Button_C Escape;
+        public Button_C Tab;
+        public Button_C Backspace;
+        public Button_C CapsLock;
+        public Button_C LeftShift;
+        public Button_C RightShift;
+        public Button_C LeftControl;
+        public Button_C RightControl;
+        public Button_C LeftAlt;
+        public Button_C RightAlt;
+        public Button_C LeftCommand;
+        public Button_C RightCommand;
+        public Button_C Comma;
+        public Button_C Period;
+        public Button_C Slash;
+        public Button_C BackQuote;
+        public Button_C Quote;
+        public Button_C Semicolon;
+        public Button_C LeftBracket;
+        public Button_C RightBracket;
+        public Button_C Backslash;
+        public Button_C Minus;
+        public Button_C Equals_k;
+        public Button_C Keypad0;
+        public Button_C Keypad1;
+        public Button_C Keypad2;
+        public Button_C Keypad3;
+        public Button_C Keypad4;
+        public Button_C Keypad5;
+        public Button_C Keypad6;
+        public Button_C Keypad7;
+        public Button_C Keypad8;
+        public Button_C Keypad9;
+        public Button_C KeypadPeriod;
+        public Button_C KeypadDivide;
+        public Button_C KeypadMultiply;
+        public Button_C KeypadMinus;
+        public Button_C KeypadPlus;
+        public Button_C KeypadEnter;
+        public Button_C Numlock;
+        public Button_C Print;
+        public Button_C Insert;
+        public Button_C Delete;
+        public Button_C Home;
+        public Button_C End;
+        public Button_C PageUp;
+        public Button_C PageDown;
+        public Button_C Pause;
+        public Button_C ScrollLock;
 
         public Keyboard_D(InputResolver resolver) : base(resolver) { }
-
-        protected override List<InputControl_D> DefineControls()
-        {
-            var keys = s_keyboardKeys.Select(kc => new KeyboardKey(kc, this) as InputControl_D).ToList();
-            foreach (KeyboardKey key in keys)
-            {
-                m_keyControllerMap.Add(key.m_keycode, key);
-            }
-            return keys;
-        }
-
-        public class KeyboardKey : Button_C
-        {
-            internal KeyCode m_keycode;
-
-            internal KeyboardKey(KeyCode listenKey, Keyboard_D keyboard)
-                : base(keyboard, listenKey.ToString())
-            {
-                m_keycode = listenKey;
-            }
-        }
     }
-
-    #region HardCodeForKeyboard
-    public partial class Keyboard_D : InputDevice_D
-    {
-        static readonly List<KeyCode> s_keyboardKeys = new List<KeyCode>
-        {
-            // 字母键 A-Z
-            KeyCode.A, KeyCode.B, KeyCode.C, KeyCode.D, KeyCode.E, KeyCode.F, KeyCode.G,
-            KeyCode.H, KeyCode.I, KeyCode.J, KeyCode.K, KeyCode.L, KeyCode.M, KeyCode.N,
-            KeyCode.O, KeyCode.P, KeyCode.Q, KeyCode.R, KeyCode.S, KeyCode.T, KeyCode.U,
-            KeyCode.V, KeyCode.W, KeyCode.X, KeyCode.Y, KeyCode.Z,
-
-            // 数字键 0-9
-            KeyCode.Alpha0, KeyCode.Alpha1, KeyCode.Alpha2, KeyCode.Alpha3, KeyCode.Alpha4,
-            KeyCode.Alpha5, KeyCode.Alpha6, KeyCode.Alpha7, KeyCode.Alpha8, KeyCode.Alpha9,
-
-            // 功能键 F1-F15
-            KeyCode.F1, KeyCode.F2, KeyCode.F3, KeyCode.F4, KeyCode.F5, KeyCode.F6,
-            KeyCode.F7, KeyCode.F8, KeyCode.F9, KeyCode.F10, KeyCode.F11, KeyCode.F12,
-
-            // 方向键
-            KeyCode.UpArrow, KeyCode.DownArrow, KeyCode.LeftArrow, KeyCode.RightArrow,
-
-            // 控制键
-            KeyCode.Space, KeyCode.Return, KeyCode.Escape, KeyCode.Tab, KeyCode.Backspace,
-            KeyCode.CapsLock, KeyCode.LeftShift, KeyCode.RightShift, KeyCode.LeftControl,
-            KeyCode.RightControl, KeyCode.LeftAlt, KeyCode.RightAlt, KeyCode.LeftCommand,
-            KeyCode.RightCommand,
-
-            // 符号键
-            KeyCode.Comma, KeyCode.Period, KeyCode.Slash, KeyCode.BackQuote, KeyCode.Quote,
-            KeyCode.Semicolon, KeyCode.LeftBracket, KeyCode.RightBracket, KeyCode.Backslash,
-            KeyCode.Minus, KeyCode.Equals, 
-
-            // 小键盘
-            KeyCode.Keypad0, KeyCode.Keypad1, KeyCode.Keypad2, KeyCode.Keypad3, KeyCode.Keypad4,
-            KeyCode.Keypad5, KeyCode.Keypad6, KeyCode.Keypad7, KeyCode.Keypad8, KeyCode.Keypad9,
-            KeyCode.KeypadPeriod, KeyCode.KeypadDivide, KeyCode.KeypadMultiply,
-            KeyCode.KeypadMinus, KeyCode.KeypadPlus, KeyCode.KeypadEnter, KeyCode.Numlock,
-
-            // 其他标准键
-            KeyCode.Print,  KeyCode.Insert, KeyCode.Delete, KeyCode.Home,
-            KeyCode.End, KeyCode.PageUp, KeyCode.PageDown, KeyCode.Pause, KeyCode.ScrollLock,
-        };
-
-        public KeyboardKey A => m_keyControllerMap[KeyCode.A];
-        public KeyboardKey B => m_keyControllerMap[KeyCode.B];
-        public KeyboardKey C => m_keyControllerMap[KeyCode.C];
-        public KeyboardKey D => m_keyControllerMap[KeyCode.D];
-        public KeyboardKey E => m_keyControllerMap[KeyCode.E];
-        public KeyboardKey F => m_keyControllerMap[KeyCode.F];
-        public KeyboardKey G => m_keyControllerMap[KeyCode.G];
-        public KeyboardKey H => m_keyControllerMap[KeyCode.H];
-        public KeyboardKey I => m_keyControllerMap[KeyCode.I];
-        public KeyboardKey J => m_keyControllerMap[KeyCode.J];
-        public KeyboardKey K => m_keyControllerMap[KeyCode.K];
-        public KeyboardKey L => m_keyControllerMap[KeyCode.L];
-        public KeyboardKey M => m_keyControllerMap[KeyCode.M];
-        public KeyboardKey N => m_keyControllerMap[KeyCode.N];
-        public KeyboardKey O => m_keyControllerMap[KeyCode.O];
-        public KeyboardKey P => m_keyControllerMap[KeyCode.P];
-        public KeyboardKey Q => m_keyControllerMap[KeyCode.Q];
-        public KeyboardKey R => m_keyControllerMap[KeyCode.R];
-        public KeyboardKey S => m_keyControllerMap[KeyCode.S];
-        public KeyboardKey T => m_keyControllerMap[KeyCode.T];
-        public KeyboardKey U => m_keyControllerMap[KeyCode.U];
-        public KeyboardKey V => m_keyControllerMap[KeyCode.V];
-        public KeyboardKey W => m_keyControllerMap[KeyCode.W];
-        public KeyboardKey X => m_keyControllerMap[KeyCode.X];
-        public KeyboardKey Y => m_keyControllerMap[KeyCode.Y];
-        public KeyboardKey Z => m_keyControllerMap[KeyCode.Z];
-        public KeyboardKey Alpha0 => m_keyControllerMap[KeyCode.Alpha0];
-        public KeyboardKey Alpha1 => m_keyControllerMap[KeyCode.Alpha1];
-        public KeyboardKey Alpha2 => m_keyControllerMap[KeyCode.Alpha2];
-        public KeyboardKey Alpha3 => m_keyControllerMap[KeyCode.Alpha3];
-        public KeyboardKey Alpha4 => m_keyControllerMap[KeyCode.Alpha4];
-        public KeyboardKey Alpha5 => m_keyControllerMap[KeyCode.Alpha5];
-        public KeyboardKey Alpha6 => m_keyControllerMap[KeyCode.Alpha6];
-        public KeyboardKey Alpha7 => m_keyControllerMap[KeyCode.Alpha7];
-        public KeyboardKey Alpha8 => m_keyControllerMap[KeyCode.Alpha8];
-        public KeyboardKey Alpha9 => m_keyControllerMap[KeyCode.Alpha9];
-        public KeyboardKey F1 => m_keyControllerMap[KeyCode.F1];
-        public KeyboardKey F2 => m_keyControllerMap[KeyCode.F2];
-        public KeyboardKey F3 => m_keyControllerMap[KeyCode.F3];
-        public KeyboardKey F4 => m_keyControllerMap[KeyCode.F4];
-        public KeyboardKey F5 => m_keyControllerMap[KeyCode.F5];
-        public KeyboardKey F6 => m_keyControllerMap[KeyCode.F6];
-        public KeyboardKey F7 => m_keyControllerMap[KeyCode.F7];
-        public KeyboardKey F8 => m_keyControllerMap[KeyCode.F8];
-        public KeyboardKey F9 => m_keyControllerMap[KeyCode.F9];
-        public KeyboardKey F10 => m_keyControllerMap[KeyCode.F10];
-        public KeyboardKey F11 => m_keyControllerMap[KeyCode.F11];
-        public KeyboardKey F12 => m_keyControllerMap[KeyCode.F12];
-        public KeyboardKey F13 => m_keyControllerMap[KeyCode.F13];
-        public KeyboardKey F14 => m_keyControllerMap[KeyCode.F14];
-        public KeyboardKey F15 => m_keyControllerMap[KeyCode.F15];
-        public KeyboardKey UpArrow => m_keyControllerMap[KeyCode.UpArrow];
-        public KeyboardKey DownArrow => m_keyControllerMap[KeyCode.DownArrow];
-        public KeyboardKey LeftArrow => m_keyControllerMap[KeyCode.LeftArrow];
-        public KeyboardKey RightArrow => m_keyControllerMap[KeyCode.RightArrow];
-        public KeyboardKey Space => m_keyControllerMap[KeyCode.Space];
-        public KeyboardKey Return => m_keyControllerMap[KeyCode.Return];
-        public KeyboardKey Escape => m_keyControllerMap[KeyCode.Escape];
-        public KeyboardKey Tab => m_keyControllerMap[KeyCode.Tab];
-        public KeyboardKey Backspace => m_keyControllerMap[KeyCode.Backspace];
-        public KeyboardKey CapsLock => m_keyControllerMap[KeyCode.CapsLock];
-        public KeyboardKey LeftShift => m_keyControllerMap[KeyCode.LeftShift];
-        public KeyboardKey RightShift => m_keyControllerMap[KeyCode.RightShift];
-        public KeyboardKey LeftControl => m_keyControllerMap[KeyCode.LeftControl];
-        public KeyboardKey RightControl => m_keyControllerMap[KeyCode.RightControl];
-        public KeyboardKey LeftAlt => m_keyControllerMap[KeyCode.LeftAlt];
-        public KeyboardKey RightAlt => m_keyControllerMap[KeyCode.RightAlt];
-        public KeyboardKey LeftCommand => m_keyControllerMap[KeyCode.LeftCommand];
-        public KeyboardKey RightCommand => m_keyControllerMap[KeyCode.RightCommand];
-        public KeyboardKey Comma => m_keyControllerMap[KeyCode.Comma];
-        public KeyboardKey Period => m_keyControllerMap[KeyCode.Period];
-        public KeyboardKey Slash => m_keyControllerMap[KeyCode.Slash];
-        public KeyboardKey BackQuote => m_keyControllerMap[KeyCode.BackQuote];
-        public KeyboardKey Quote => m_keyControllerMap[KeyCode.Quote];
-        public KeyboardKey Semicolon => m_keyControllerMap[KeyCode.Semicolon];
-        public KeyboardKey LeftBracket => m_keyControllerMap[KeyCode.LeftBracket];
-        public KeyboardKey RightBracket => m_keyControllerMap[KeyCode.RightBracket];
-        public KeyboardKey Backslash => m_keyControllerMap[KeyCode.Backslash];
-        public KeyboardKey Minus => m_keyControllerMap[KeyCode.Minus];
-        public KeyboardKey Equals_k => m_keyControllerMap[KeyCode.Equals];
-        public KeyboardKey Keypad0 => m_keyControllerMap[KeyCode.Keypad0];
-        public KeyboardKey Keypad1 => m_keyControllerMap[KeyCode.Keypad1];
-        public KeyboardKey Keypad2 => m_keyControllerMap[KeyCode.Keypad2];
-        public KeyboardKey Keypad3 => m_keyControllerMap[KeyCode.Keypad3];
-        public KeyboardKey Keypad4 => m_keyControllerMap[KeyCode.Keypad4];
-        public KeyboardKey Keypad5 => m_keyControllerMap[KeyCode.Keypad5];
-        public KeyboardKey Keypad6 => m_keyControllerMap[KeyCode.Keypad6];
-        public KeyboardKey Keypad7 => m_keyControllerMap[KeyCode.Keypad7];
-        public KeyboardKey Keypad8 => m_keyControllerMap[KeyCode.Keypad8];
-        public KeyboardKey Keypad9 => m_keyControllerMap[KeyCode.Keypad9];
-        public KeyboardKey KeypadPeriod => m_keyControllerMap[KeyCode.KeypadPeriod];
-        public KeyboardKey KeypadDivide => m_keyControllerMap[KeyCode.KeypadDivide];
-        public KeyboardKey KeypadMultiply => m_keyControllerMap[KeyCode.KeypadMultiply];
-        public KeyboardKey KeypadMinus => m_keyControllerMap[KeyCode.KeypadMinus];
-        public KeyboardKey KeypadPlus => m_keyControllerMap[KeyCode.KeypadPlus];
-        public KeyboardKey KeypadEnter => m_keyControllerMap[KeyCode.KeypadEnter];
-        public KeyboardKey Numlock => m_keyControllerMap[KeyCode.Numlock];
-        public KeyboardKey Print => m_keyControllerMap[KeyCode.Print];
-        public KeyboardKey Insert => m_keyControllerMap[KeyCode.Insert];
-        public KeyboardKey Delete => m_keyControllerMap[KeyCode.Delete];
-        public KeyboardKey Home => m_keyControllerMap[KeyCode.Home];
-        public KeyboardKey End => m_keyControllerMap[KeyCode.End];
-        public KeyboardKey PageUp => m_keyControllerMap[KeyCode.PageUp];
-        public KeyboardKey PageDown => m_keyControllerMap[KeyCode.PageDown];
-        public KeyboardKey Pause => m_keyControllerMap[KeyCode.Pause];
-        public KeyboardKey ScrollLock => m_keyControllerMap[KeyCode.ScrollLock];
-    }
-    #endregion
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController_D.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController_D.cs
index 4d96be15..85a6e3c3 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController_D.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/Devices/PSVController_D.cs
@@ -1,54 +1,22 @@
-using System.Collections.Generic;
-
-namespace AxibugEmuOnline.Client.InputDevices
+namespace AxibugEmuOnline.Client.InputDevices
 {
     public class PSVController_D : InputDevice_D
     {
-        /// <summary> × </summary>
-        public Button_C Cross { get; private set; }
-        /// <summary> ○ </summary>
-        public Button_C Circle { get; private set; }
-        /// <summary> □ </summary>
-        public Button_C Square { get; private set; }
-        /// <summary> △ </summary>
-        public Button_C Triangle { get; private set; }
-        public Button_C L { get; private set; }
-        public Button_C R { get; private set; }
-        public Button_C Select { get; private set; }
-        public Button_C Start { get; private set; }
-        public Button_C Up { get; private set; }
-        public Button_C Right { get; private set; }
-        public Button_C Down { get; private set; }
-        public Button_C Left { get; private set; }
-        public Stick_C LeftStick { get; private set; }
-        public Stick_C RightStick { get; private set; }
+        public Button_C Cross;
+        public Button_C Circle;
+        public Button_C Square;
+        public Button_C Triangle;
+        public Button_C L;
+        public Button_C R;
+        public Button_C Select;
+        public Button_C Start;
+        public Button_C Up;
+        public Button_C Right;
+        public Button_C Down;
+        public Button_C Left;
+        public Stick_C LeftStick;
+        public Stick_C RightStick;
 
         public PSVController_D(InputResolver resolver) : base(resolver) { }
-
-        protected override List<InputControl_D> DefineControls()
-        {
-            List<InputControl_D> result = new List<InputControl_D>();
-
-            Cross = new Button_C(this, "X");
-            Circle = new Button_C(this, "⭕");
-            Square = new Button_C(this, "□");
-            Triangle = new Button_C(this, "△");
-
-            L = new Button_C(this, "L");
-            R = new Button_C(this, "R");
-
-            Select = new Button_C(this, "SELECT");
-            Start = new Button_C(this, "START");
-
-            Up = new Button_C(this, "UP");
-            Right = new Button_C(this, "RIGHT");
-            Down = new Button_C(this, "DOWN");
-            Left = new Button_C(this, "LEFT");
-
-            LeftStick = new Stick_C(this, nameof(LeftStick));
-            RightStick = new Stick_C(this, nameof(RightStick));
-
-            return result;
-        }
     }
 }
\ No newline at end of file
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs
index ee448e40..4efbdeb9 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputResolver.cs
@@ -56,9 +56,9 @@ namespace AxibugEmuOnline.Client.InputDevices
             OnDeviceConnected?.Invoke(connectDevice);
         }
 
-        public abstract bool CheckPerforming<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_D;
-        public abstract Vector2 GetVector2<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_D;
-        public abstract float GetFloat<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_D;
+        public abstract bool CheckPerforming<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_C;
+        public abstract Vector2 GetVector2<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_C;
+        public abstract float GetFloat<CONTROLLER>(CONTROLLER control) where CONTROLLER : InputControl_C;
         /// <summary>
         /// 获得输入设备的唯一名称
         /// </summary>
diff --git a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
index c8d96634..8144eef9 100644
--- a/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
+++ b/AxibugEmuOnline.Client/Assets/Script/AppMain/Manager/InputDevicesManager/InputResolver/InputSystemResolver.cs
@@ -21,7 +21,13 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
         private void AddDevice(InputDevice ipdev)
         {
             InputDevice_D newDevice = null;
-            if (ipdev is Keyboard) newDevice = new Keyboard_D(this);
+            if (ipdev is Keyboard)
+            {
+                newDevice = new Keyboard_D(this);
+                AddKeyboardMapper((Keyboard_D)newDevice, (Keyboard)ipdev);
+            }
+            else if (ipdev is Gamepad) newDevice = new GamePad_D(this);
+
             if (newDevice != null)
             {
                 m_devices.Add(ipdev, newDevice);
@@ -35,12 +41,23 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
             {
                 m_devices.Remove(ipdev);
                 RaiseDeviceLost(device);
+
+                if (device is Keyboard_D)
+                {
+                    RemoveKeyboardMapper((Keyboard_D)device);
+                }
             }
         }
 
+        private T GetInputSystemDevice<T>(InputDevice_D device) where T : InputDevice
+        {
+            m_devices.TryGetKey(device, out var ipDev);
+            return ipDev as T;
+        }
+
         public override string GetDeviceName(InputDevice_D inputDevice)
         {
-            m_devices.TryGetKey(inputDevice, out var ipdev);
+            var ipdev = GetInputSystemDevice<InputDevice>(inputDevice);
             Debug.Assert(ipdev != null, "不能对已离线的设备获取名称");
 
             return $"{ipdev.description.deviceClass}_{ipdev.description.interfaceName}_{ipdev.deviceId}";
@@ -51,12 +68,12 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
             return m_devices.TryGetKey(device, out var _);
         }
 
-        private void IP_onDeviceChange(InputDevice device, UnityEngine.InputSystem.InputDeviceChange changeType)
+        private void IP_onDeviceChange(InputDevice device, InputDeviceChange changeType)
         {
             switch (changeType)
             {
-                case UnityEngine.InputSystem.InputDeviceChange.Added: AddDevice(device); break;
-                case UnityEngine.InputSystem.InputDeviceChange.Removed: RemoveDevice(device); break;
+                case InputDeviceChange.Added: AddDevice(device); break;
+                case InputDeviceChange.Removed: RemoveDevice(device); break;
             }
         }
 
@@ -69,22 +86,11 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
         {
             if (control.Device is Keyboard_D keyboard)
             {
-                if (control is Keyboard_D.KeyboardKey key)
-                {
-                    if (m_devices.TryGetKey(keyboard, out var ipdev))
-                    {
-                        var ipKeyboard = ipdev as Keyboard;
-                        if (ipKeyboard == null) return false;
-
-                        var k = GetIPKeyboardKey(ipKeyboard, key.m_keycode);
-                        return k.isPressed;
-                    }
-
-                    return false;
-                }
+                var ipKeyboard = GetInputSystemDevice<Keyboard>(keyboard);
+                var k = GetIPKeyboardKey(ipKeyboard, keyboard, control);
+                return k.isPressed;
             }
 
-
             throw new System.NotImplementedException();
         }
 
@@ -98,130 +104,132 @@ namespace AxibugEmuOnline.Client.InputDevices.ForInputSystem
             throw new System.NotImplementedException();
         }
 
-        static ButtonControl GetIPKeyboardKey(Keyboard keyboard, KeyCode key)
+        ButtonControl GetIPKeyboardKey(Keyboard ipKeyboard, Keyboard_D keyboard, InputControl_C key)
         {
-            switch (key)
+            var mapper = m_keyboardMapper[keyboard];
+            mapper.TryGetValue(key, out ButtonControl inputBtn);
+            if (inputBtn != null)
+                return inputBtn;
+            else
             {
-                // 字母键(A-Z)
-                case KeyCode.A: return keyboard.aKey;
-                case KeyCode.B: return keyboard.bKey;
-                case KeyCode.C: return keyboard.cKey;
-                case KeyCode.D: return keyboard.dKey;
-                case KeyCode.E: return keyboard.eKey;
-                case KeyCode.F: return keyboard.fKey;
-                case KeyCode.G: return keyboard.gKey;
-                case KeyCode.H: return keyboard.hKey;
-                case KeyCode.I: return keyboard.iKey;
-                case KeyCode.J: return keyboard.jKey;
-                case KeyCode.K: return keyboard.kKey;
-                case KeyCode.L: return keyboard.lKey;
-                case KeyCode.M: return keyboard.mKey;
-                case KeyCode.N: return keyboard.nKey;
-                case KeyCode.O: return keyboard.oKey;
-                case KeyCode.P: return keyboard.pKey;
-                case KeyCode.Q: return keyboard.qKey;
-                case KeyCode.R: return keyboard.rKey;
-                case KeyCode.S: return keyboard.sKey;
-                case KeyCode.T: return keyboard.tKey;
-                case KeyCode.U: return keyboard.uKey;
-                case KeyCode.V: return keyboard.vKey;
-                case KeyCode.W: return keyboard.wKey;
-                case KeyCode.X: return keyboard.xKey;
-                case KeyCode.Y: return keyboard.yKey;
-                case KeyCode.Z: return keyboard.zKey;
-
-                // 数字键(0-9)
-                case KeyCode.Alpha0: return keyboard.digit0Key;
-                case KeyCode.Alpha1: return keyboard.digit1Key;
-                case KeyCode.Alpha2: return keyboard.digit2Key;
-                case KeyCode.Alpha3: return keyboard.digit3Key;
-                case KeyCode.Alpha4: return keyboard.digit4Key;
-                case KeyCode.Alpha5: return keyboard.digit5Key;
-                case KeyCode.Alpha6: return keyboard.digit6Key;
-                case KeyCode.Alpha7: return keyboard.digit7Key;
-                case KeyCode.Alpha8: return keyboard.digit8Key;
-                case KeyCode.Alpha9: return keyboard.digit9Key;
-
-                // 小键盘
-                case KeyCode.Keypad0: return keyboard.numpad0Key;
-                case KeyCode.Keypad1: return keyboard.numpad1Key;
-                case KeyCode.Keypad2: return keyboard.numpad2Key;
-                case KeyCode.Keypad3: return keyboard.numpad3Key;
-                case KeyCode.Keypad4: return keyboard.numpad4Key;
-                case KeyCode.Keypad5: return keyboard.numpad5Key;
-                case KeyCode.Keypad6: return keyboard.numpad6Key;
-                case KeyCode.Keypad7: return keyboard.numpad7Key;
-                case KeyCode.Keypad8: return keyboard.numpad8Key;
-                case KeyCode.Keypad9: return keyboard.numpad9Key;
-                case KeyCode.KeypadPeriod: return keyboard.numpadPeriodKey;
-                case KeyCode.KeypadDivide: return keyboard.numpadDivideKey;
-                case KeyCode.KeypadMultiply: return keyboard.numpadMultiplyKey;
-                case KeyCode.KeypadMinus: return keyboard.numpadMinusKey;
-                case KeyCode.KeypadPlus: return keyboard.numpadPlusKey;
-                case KeyCode.KeypadEnter: return keyboard.numpadEnterKey;
-                case KeyCode.KeypadEquals: return keyboard.numpadEqualsKey;
-
-                // 功能键(F1-F15)
-                case KeyCode.F1: return keyboard.f1Key;
-                case KeyCode.F2: return keyboard.f2Key;
-                case KeyCode.F3: return keyboard.f3Key;
-                case KeyCode.F4: return keyboard.f4Key;
-                case KeyCode.F5: return keyboard.f5Key;
-                case KeyCode.F6: return keyboard.f6Key;
-                case KeyCode.F7: return keyboard.f7Key;
-                case KeyCode.F8: return keyboard.f8Key;
-                case KeyCode.F9: return keyboard.f9Key;
-                case KeyCode.F10: return keyboard.f10Key;
-                case KeyCode.F11: return keyboard.f11Key;
-                case KeyCode.F12: return keyboard.f12Key;
-
-                // 方向键
-                case KeyCode.UpArrow: return keyboard.upArrowKey;
-                case KeyCode.DownArrow: return keyboard.downArrowKey;
-                case KeyCode.LeftArrow: return keyboard.leftArrowKey;
-                case KeyCode.RightArrow: return keyboard.rightArrowKey;
-
-                // 符号键
-                case KeyCode.Space: return keyboard.spaceKey;
-                case KeyCode.Backspace: return keyboard.backspaceKey;
-                case KeyCode.Tab: return keyboard.tabKey;
-                case KeyCode.Return: return keyboard.enterKey;
-                case KeyCode.Escape: return keyboard.escapeKey;
-                case KeyCode.LeftShift: return keyboard.leftShiftKey;
-                case KeyCode.RightShift: return keyboard.rightShiftKey;
-                case KeyCode.LeftControl: return keyboard.leftCtrlKey;
-                case KeyCode.RightControl: return keyboard.rightCtrlKey;
-                case KeyCode.LeftAlt: return keyboard.leftAltKey;
-                case KeyCode.RightAlt: return keyboard.rightAltKey;
-                case KeyCode.LeftCommand: return keyboard.leftCommandKey; // macOS Command键
-                case KeyCode.RightCommand: return keyboard.rightCommandKey;
-                case KeyCode.CapsLock: return keyboard.capsLockKey;
-                case KeyCode.Numlock: return keyboard.numLockKey;
-                case KeyCode.ScrollLock: return keyboard.scrollLockKey;
-                case KeyCode.Print: return keyboard.printScreenKey;
-                case KeyCode.Pause: return keyboard.pauseKey;
-                case KeyCode.Insert: return keyboard.insertKey;
-                case KeyCode.Home: return keyboard.homeKey;
-                case KeyCode.End: return keyboard.endKey;
-                case KeyCode.PageUp: return keyboard.pageUpKey;
-                case KeyCode.PageDown: return keyboard.pageDownKey;
-                case KeyCode.Delete: return keyboard.deleteKey;
-                case KeyCode.Comma: return keyboard.commaKey;
-                case KeyCode.Period: return keyboard.periodKey;
-                case KeyCode.Slash: return keyboard.slashKey;
-                case KeyCode.BackQuote: return keyboard.backquoteKey;
-                case KeyCode.Minus: return keyboard.minusKey;
-                case KeyCode.Equals: return keyboard.equalsKey;
-                case KeyCode.LeftBracket: return keyboard.leftBracketKey;
-                case KeyCode.RightBracket: return keyboard.rightBracketKey;
-                case KeyCode.Backslash: return keyboard.backslashKey;
-                case KeyCode.Semicolon: return keyboard.semicolonKey;
-                case KeyCode.Quote: return keyboard.quoteKey;
-                default:
-                    throw new System.NotImplementedException($"Not Find KeyCode Mapper Code from {key}");
+                throw new System.Exception($"not found keyboard mapper setting : {key}");
             }
         }
+        Dictionary<Keyboard_D, Dictionary<InputControl_C, ButtonControl>> m_keyboardMapper = new Dictionary<Keyboard_D, Dictionary<InputControl_C, ButtonControl>>();
+        void AddKeyboardMapper(Keyboard_D keyboard_d, Keyboard ipkeyboard)
+        {
+            m_keyboardMapper.Add(keyboard_d, new Dictionary<InputControl_C, ButtonControl>());
+            var mapper = m_keyboardMapper[keyboard_d];
 
+            mapper.Add(keyboard_d.A, ipkeyboard.aKey);
+            mapper.Add(keyboard_d.B, ipkeyboard.bKey);
+            mapper.Add(keyboard_d.C, ipkeyboard.cKey);
+            mapper.Add(keyboard_d.D, ipkeyboard.dKey);
+            mapper.Add(keyboard_d.E, ipkeyboard.eKey);
+            mapper.Add(keyboard_d.F, ipkeyboard.fKey);
+            mapper.Add(keyboard_d.G, ipkeyboard.gKey);
+            mapper.Add(keyboard_d.H, ipkeyboard.hKey);
+            mapper.Add(keyboard_d.I, ipkeyboard.iKey);
+            mapper.Add(keyboard_d.J, ipkeyboard.jKey);
+            mapper.Add(keyboard_d.K, ipkeyboard.kKey);
+            mapper.Add(keyboard_d.L, ipkeyboard.lKey);
+            mapper.Add(keyboard_d.M, ipkeyboard.mKey);
+            mapper.Add(keyboard_d.N, ipkeyboard.nKey);
+            mapper.Add(keyboard_d.O, ipkeyboard.oKey);
+            mapper.Add(keyboard_d.P, ipkeyboard.pKey);
+            mapper.Add(keyboard_d.Q, ipkeyboard.qKey);
+            mapper.Add(keyboard_d.R, ipkeyboard.rKey);
+            mapper.Add(keyboard_d.S, ipkeyboard.sKey);
+            mapper.Add(keyboard_d.T, ipkeyboard.tKey);
+            mapper.Add(keyboard_d.U, ipkeyboard.uKey);
+            mapper.Add(keyboard_d.V, ipkeyboard.vKey);
+            mapper.Add(keyboard_d.W, ipkeyboard.wKey);
+            mapper.Add(keyboard_d.X, ipkeyboard.xKey);
+            mapper.Add(keyboard_d.Y, ipkeyboard.yKey);
+            mapper.Add(keyboard_d.Z, ipkeyboard.zKey);
+            mapper.Add(keyboard_d.Alpha0, ipkeyboard.digit0Key);
+            mapper.Add(keyboard_d.Alpha1, ipkeyboard.digit1Key);
+            mapper.Add(keyboard_d.Alpha2, ipkeyboard.digit2Key);
+            mapper.Add(keyboard_d.Alpha3, ipkeyboard.digit3Key);
+            mapper.Add(keyboard_d.Alpha4, ipkeyboard.digit4Key);
+            mapper.Add(keyboard_d.Alpha5, ipkeyboard.digit5Key);
+            mapper.Add(keyboard_d.Alpha6, ipkeyboard.digit6Key);
+            mapper.Add(keyboard_d.Alpha7, ipkeyboard.digit7Key);
+            mapper.Add(keyboard_d.Alpha8, ipkeyboard.digit8Key);
+            mapper.Add(keyboard_d.Alpha9, ipkeyboard.digit9Key);
+            mapper.Add(keyboard_d.Keypad0, ipkeyboard.numpad0Key);
+            mapper.Add(keyboard_d.Keypad1, ipkeyboard.numpad1Key);
+            mapper.Add(keyboard_d.Keypad2, ipkeyboard.numpad2Key);
+            mapper.Add(keyboard_d.Keypad3, ipkeyboard.numpad3Key);
+            mapper.Add(keyboard_d.Keypad4, ipkeyboard.numpad4Key);
+            mapper.Add(keyboard_d.Keypad5, ipkeyboard.numpad5Key);
+            mapper.Add(keyboard_d.Keypad6, ipkeyboard.numpad6Key);
+            mapper.Add(keyboard_d.Keypad7, ipkeyboard.numpad7Key);
+            mapper.Add(keyboard_d.Keypad8, ipkeyboard.numpad8Key);
+            mapper.Add(keyboard_d.Keypad9, ipkeyboard.numpad9Key);
+            mapper.Add(keyboard_d.KeypadPeriod, ipkeyboard.numpadPeriodKey);
+            mapper.Add(keyboard_d.KeypadDivide, ipkeyboard.numpadDivideKey);
+            mapper.Add(keyboard_d.KeypadMultiply, ipkeyboard.numpadMultiplyKey);
+            mapper.Add(keyboard_d.KeypadMinus, ipkeyboard.numpadMinusKey);
+            mapper.Add(keyboard_d.KeypadPlus, ipkeyboard.numpadPlusKey);
+            mapper.Add(keyboard_d.KeypadEnter, ipkeyboard.numpadEnterKey);
+            mapper.Add(keyboard_d.F1, ipkeyboard.f1Key);
+            mapper.Add(keyboard_d.F2, ipkeyboard.f2Key);
+            mapper.Add(keyboard_d.F3, ipkeyboard.f3Key);
+            mapper.Add(keyboard_d.F4, ipkeyboard.f4Key);
+            mapper.Add(keyboard_d.F5, ipkeyboard.f5Key);
+            mapper.Add(keyboard_d.F6, ipkeyboard.f6Key);
+            mapper.Add(keyboard_d.F7, ipkeyboard.f7Key);
+            mapper.Add(keyboard_d.F8, ipkeyboard.f8Key);
+            mapper.Add(keyboard_d.F9, ipkeyboard.f9Key);
+            mapper.Add(keyboard_d.F10, ipkeyboard.f10Key);
+            mapper.Add(keyboard_d.F11, ipkeyboard.f11Key);
+            mapper.Add(keyboard_d.F12, ipkeyboard.f12Key);
+            mapper.Add(keyboard_d.UpArrow, ipkeyboard.upArrowKey);
+            mapper.Add(keyboard_d.DownArrow, ipkeyboard.downArrowKey);
+            mapper.Add(keyboard_d.LeftArrow, ipkeyboard.leftArrowKey);
+            mapper.Add(keyboard_d.RightArrow, ipkeyboard.rightArrowKey);
+            mapper.Add(keyboard_d.Space, ipkeyboard.spaceKey);
+            mapper.Add(keyboard_d.Backspace, ipkeyboard.backspaceKey);
+            mapper.Add(keyboard_d.Tab, ipkeyboard.tabKey);
+            mapper.Add(keyboard_d.Return, ipkeyboard.enterKey);
+            mapper.Add(keyboard_d.Escape, ipkeyboard.escapeKey);
+            mapper.Add(keyboard_d.LeftShift, ipkeyboard.leftShiftKey);
+            mapper.Add(keyboard_d.RightShift, ipkeyboard.rightShiftKey);
+            mapper.Add(keyboard_d.LeftControl, ipkeyboard.leftCtrlKey);
+            mapper.Add(keyboard_d.RightControl, ipkeyboard.rightCtrlKey);
+            mapper.Add(keyboard_d.LeftAlt, ipkeyboard.leftAltKey);
+            mapper.Add(keyboard_d.RightAlt, ipkeyboard.rightAltKey);
+            mapper.Add(keyboard_d.LeftCommand, ipkeyboard.leftCommandKey);
+            mapper.Add(keyboard_d.RightCommand, ipkeyboard.rightCommandKey);
+            mapper.Add(keyboard_d.CapsLock, ipkeyboard.capsLockKey);
+            mapper.Add(keyboard_d.Numlock, ipkeyboard.numLockKey);
+            mapper.Add(keyboard_d.ScrollLock, ipkeyboard.scrollLockKey);
+            mapper.Add(keyboard_d.Print, ipkeyboard.printScreenKey);
+            mapper.Add(keyboard_d.Pause, ipkeyboard.pauseKey);
+            mapper.Add(keyboard_d.Insert, ipkeyboard.insertKey);
+            mapper.Add(keyboard_d.Home, ipkeyboard.homeKey);
+            mapper.Add(keyboard_d.End, ipkeyboard.endKey);
+            mapper.Add(keyboard_d.PageUp, ipkeyboard.pageUpKey);
+            mapper.Add(keyboard_d.PageDown, ipkeyboard.pageDownKey);
+            mapper.Add(keyboard_d.Delete, ipkeyboard.deleteKey);
+            mapper.Add(keyboard_d.Comma, ipkeyboard.commaKey);
+            mapper.Add(keyboard_d.Period, ipkeyboard.periodKey);
+            mapper.Add(keyboard_d.Slash, ipkeyboard.slashKey);
+            mapper.Add(keyboard_d.BackQuote, ipkeyboard.backquoteKey);
+            mapper.Add(keyboard_d.Minus, ipkeyboard.minusKey);
+            mapper.Add(keyboard_d.Equals_k, ipkeyboard.equalsKey);
+            mapper.Add(keyboard_d.LeftBracket, ipkeyboard.leftBracketKey);
+            mapper.Add(keyboard_d.RightBracket, ipkeyboard.rightBracketKey);
+            mapper.Add(keyboard_d.Backslash, ipkeyboard.backslashKey);
+            mapper.Add(keyboard_d.Semicolon, ipkeyboard.semicolonKey);
+            mapper.Add(keyboard_d.Quote, ipkeyboard.quoteKey);
+        }
+        void RemoveKeyboardMapper(Keyboard_D keyboard_d)
+        {
+            m_keyboardMapper.Remove(keyboard_d);
+        }
     }
+
 }
 #endif
\ No newline at end of file