3 #if SILICONSTUDIO_PLATFORM_WINDOWS_RUNTIME
5 using System.Collections.Generic;
6 using SiliconStudio.Core;
7 using SiliconStudio.Core.Mathematics;
8 using SiliconStudio.Paradox.Games;
9 using Windows.Foundation;
11 using Windows.UI.Core;
12 using Windows.UI.Xaml;
13 using Windows.UI.Xaml.Controls;
14 using Windows.UI.Xaml.Input;
15 using Windows.UI.Xaml.Media;
16 using Windows.UI.Input;
18 using WinRTPointerDeviceType = Windows.Devices.Input.PointerDeviceType;
19 using WinRTPointerPoint = Windows.UI.Input.PointerPoint;
21 namespace SiliconStudio.
Paradox.Input
23 public partial class InputManager
26 private static readonly Dictionary<VirtualKey, Keys> mapKeys;
29 public override bool MultiTouchEnabled {
get {
return true; } set { } }
33 mapKeys =
new Dictionary<VirtualKey, Keys>();
35 AddKeys(WinFormsKeys.None,
Keys.None);
36 AddKeys(WinFormsKeys.Cancel,
Keys.Cancel);
37 AddKeys(WinFormsKeys.Back,
Keys.Back);
38 AddKeys(WinFormsKeys.Tab,
Keys.Tab);
39 AddKeys(WinFormsKeys.LineFeed,
Keys.LineFeed);
40 AddKeys(WinFormsKeys.Clear,
Keys.Clear);
41 AddKeys(WinFormsKeys.Enter,
Keys.Enter);
42 AddKeys(WinFormsKeys.Return,
Keys.Return);
43 AddKeys(WinFormsKeys.Pause,
Keys.Pause);
44 AddKeys(WinFormsKeys.Capital,
Keys.Capital);
45 AddKeys(WinFormsKeys.CapsLock,
Keys.CapsLock);
46 AddKeys(WinFormsKeys.HangulMode,
Keys.HangulMode);
47 AddKeys(WinFormsKeys.KanaMode,
Keys.KanaMode);
48 AddKeys(WinFormsKeys.JunjaMode,
Keys.JunjaMode);
49 AddKeys(WinFormsKeys.FinalMode,
Keys.FinalMode);
50 AddKeys(WinFormsKeys.HanjaMode,
Keys.HanjaMode);
51 AddKeys(WinFormsKeys.KanjiMode,
Keys.KanjiMode);
52 AddKeys(WinFormsKeys.Escape,
Keys.Escape);
53 AddKeys(WinFormsKeys.IMEConvert,
Keys.ImeConvert);
54 AddKeys(WinFormsKeys.IMENonconvert,
Keys.ImeNonConvert);
55 AddKeys(WinFormsKeys.IMEAccept,
Keys.ImeAccept);
56 AddKeys(WinFormsKeys.IMEModeChange,
Keys.ImeModeChange);
57 AddKeys(WinFormsKeys.Space,
Keys.Space);
58 AddKeys(WinFormsKeys.PageUp,
Keys.PageUp);
59 AddKeys(WinFormsKeys.Prior,
Keys.Prior);
60 AddKeys(WinFormsKeys.Next,
Keys.Next);
61 AddKeys(WinFormsKeys.PageDown,
Keys.PageDown);
62 AddKeys(WinFormsKeys.End,
Keys.End);
63 AddKeys(WinFormsKeys.Home,
Keys.Home);
64 AddKeys(WinFormsKeys.Left,
Keys.Left);
65 AddKeys(WinFormsKeys.Up,
Keys.Up);
66 AddKeys(WinFormsKeys.Right,
Keys.Right);
67 AddKeys(WinFormsKeys.Down,
Keys.Down);
68 AddKeys(WinFormsKeys.Select,
Keys.Select);
69 AddKeys(WinFormsKeys.Print,
Keys.Print);
70 AddKeys(WinFormsKeys.Execute,
Keys.Execute);
71 AddKeys(WinFormsKeys.PrintScreen,
Keys.PrintScreen);
72 AddKeys(WinFormsKeys.Snapshot,
Keys.Snapshot);
73 AddKeys(WinFormsKeys.Insert,
Keys.Insert);
74 AddKeys(WinFormsKeys.Delete,
Keys.Delete);
75 AddKeys(WinFormsKeys.Help,
Keys.Help);
76 AddKeys(WinFormsKeys.D0,
Keys.D0);
77 AddKeys(WinFormsKeys.D1,
Keys.D1);
78 AddKeys(WinFormsKeys.D2,
Keys.D2);
79 AddKeys(WinFormsKeys.D3,
Keys.D3);
80 AddKeys(WinFormsKeys.D4,
Keys.D4);
81 AddKeys(WinFormsKeys.D5,
Keys.D5);
82 AddKeys(WinFormsKeys.D6,
Keys.D6);
83 AddKeys(WinFormsKeys.D7,
Keys.D7);
84 AddKeys(WinFormsKeys.D8,
Keys.D8);
85 AddKeys(WinFormsKeys.D9,
Keys.D9);
86 AddKeys(WinFormsKeys.A,
Keys.A);
87 AddKeys(WinFormsKeys.B,
Keys.B);
88 AddKeys(WinFormsKeys.C,
Keys.C);
89 AddKeys(WinFormsKeys.D,
Keys.D);
90 AddKeys(WinFormsKeys.E,
Keys.E);
91 AddKeys(WinFormsKeys.F,
Keys.F);
92 AddKeys(WinFormsKeys.G,
Keys.G);
93 AddKeys(WinFormsKeys.H,
Keys.H);
94 AddKeys(WinFormsKeys.I,
Keys.I);
95 AddKeys(WinFormsKeys.J,
Keys.J);
96 AddKeys(WinFormsKeys.K,
Keys.K);
97 AddKeys(WinFormsKeys.L,
Keys.L);
98 AddKeys(WinFormsKeys.M,
Keys.M);
99 AddKeys(WinFormsKeys.N,
Keys.N);
100 AddKeys(WinFormsKeys.O,
Keys.O);
101 AddKeys(WinFormsKeys.P,
Keys.P);
102 AddKeys(WinFormsKeys.Q,
Keys.Q);
103 AddKeys(WinFormsKeys.R,
Keys.R);
104 AddKeys(WinFormsKeys.S,
Keys.S);
105 AddKeys(WinFormsKeys.T,
Keys.T);
106 AddKeys(WinFormsKeys.U,
Keys.U);
107 AddKeys(WinFormsKeys.V,
Keys.V);
108 AddKeys(WinFormsKeys.W,
Keys.W);
109 AddKeys(WinFormsKeys.X,
Keys.X);
110 AddKeys(WinFormsKeys.Y,
Keys.Y);
111 AddKeys(WinFormsKeys.Z,
Keys.Z);
112 AddKeys(WinFormsKeys.LWin,
Keys.LeftWin);
113 AddKeys(WinFormsKeys.RWin,
Keys.RightWin);
114 AddKeys(WinFormsKeys.Apps,
Keys.Apps);
115 AddKeys(WinFormsKeys.Sleep,
Keys.Sleep);
116 AddKeys(WinFormsKeys.NumPad0,
Keys.NumPad0);
117 AddKeys(WinFormsKeys.NumPad1,
Keys.NumPad1);
118 AddKeys(WinFormsKeys.NumPad2,
Keys.NumPad2);
119 AddKeys(WinFormsKeys.NumPad3,
Keys.NumPad3);
120 AddKeys(WinFormsKeys.NumPad4,
Keys.NumPad4);
121 AddKeys(WinFormsKeys.NumPad5,
Keys.NumPad5);
122 AddKeys(WinFormsKeys.NumPad6,
Keys.NumPad6);
123 AddKeys(WinFormsKeys.NumPad7,
Keys.NumPad7);
124 AddKeys(WinFormsKeys.NumPad8,
Keys.NumPad8);
125 AddKeys(WinFormsKeys.NumPad9,
Keys.NumPad9);
126 AddKeys(WinFormsKeys.Multiply,
Keys.Multiply);
127 AddKeys(WinFormsKeys.Add,
Keys.Add);
128 AddKeys(WinFormsKeys.Separator,
Keys.Separator);
129 AddKeys(WinFormsKeys.Subtract,
Keys.Subtract);
130 AddKeys(WinFormsKeys.Decimal,
Keys.Decimal);
131 AddKeys(WinFormsKeys.Divide,
Keys.Divide);
132 AddKeys(WinFormsKeys.F1,
Keys.F1);
133 AddKeys(WinFormsKeys.F2,
Keys.F2);
134 AddKeys(WinFormsKeys.F3,
Keys.F3);
135 AddKeys(WinFormsKeys.F4,
Keys.F4);
136 AddKeys(WinFormsKeys.F5,
Keys.F5);
137 AddKeys(WinFormsKeys.F6,
Keys.F6);
138 AddKeys(WinFormsKeys.F7,
Keys.F7);
139 AddKeys(WinFormsKeys.F8,
Keys.F8);
140 AddKeys(WinFormsKeys.F9,
Keys.F9);
141 AddKeys(WinFormsKeys.F10,
Keys.F10);
142 AddKeys(WinFormsKeys.F11,
Keys.F11);
143 AddKeys(WinFormsKeys.F12,
Keys.F12);
144 AddKeys(WinFormsKeys.F13,
Keys.F13);
145 AddKeys(WinFormsKeys.F14,
Keys.F14);
146 AddKeys(WinFormsKeys.F15,
Keys.F15);
147 AddKeys(WinFormsKeys.F16,
Keys.F16);
148 AddKeys(WinFormsKeys.F17,
Keys.F17);
149 AddKeys(WinFormsKeys.F18,
Keys.F18);
150 AddKeys(WinFormsKeys.F19,
Keys.F19);
151 AddKeys(WinFormsKeys.F20,
Keys.F20);
152 AddKeys(WinFormsKeys.F21,
Keys.F21);
153 AddKeys(WinFormsKeys.F22,
Keys.F22);
154 AddKeys(WinFormsKeys.F23,
Keys.F23);
155 AddKeys(WinFormsKeys.F24,
Keys.F24);
156 AddKeys(WinFormsKeys.NumLock,
Keys.NumLock);
157 AddKeys(WinFormsKeys.Scroll,
Keys.Scroll);
158 AddKeys(WinFormsKeys.LShiftKey,
Keys.LeftShift);
159 AddKeys(WinFormsKeys.RShiftKey,
Keys.RightShift);
160 AddKeys(WinFormsKeys.LControlKey,
Keys.LeftCtrl);
161 AddKeys(WinFormsKeys.RControlKey,
Keys.RightCtrl);
162 AddKeys(WinFormsKeys.LMenu,
Keys.LeftAlt);
163 AddKeys(WinFormsKeys.RMenu,
Keys.RightAlt);
164 AddKeys(WinFormsKeys.BrowserBack,
Keys.BrowserBack);
165 AddKeys(WinFormsKeys.BrowserForward,
Keys.BrowserForward);
166 AddKeys(WinFormsKeys.BrowserRefresh,
Keys.BrowserRefresh);
167 AddKeys(WinFormsKeys.BrowserStop,
Keys.BrowserStop);
168 AddKeys(WinFormsKeys.BrowserSearch,
Keys.BrowserSearch);
169 AddKeys(WinFormsKeys.BrowserFavorites,
Keys.BrowserFavorites);
170 AddKeys(WinFormsKeys.BrowserHome,
Keys.BrowserHome);
171 AddKeys(WinFormsKeys.VolumeMute,
Keys.VolumeMute);
172 AddKeys(WinFormsKeys.VolumeDown,
Keys.VolumeDown);
173 AddKeys(WinFormsKeys.VolumeUp,
Keys.VolumeUp);
174 AddKeys(WinFormsKeys.MediaNextTrack,
Keys.MediaNextTrack);
175 AddKeys(WinFormsKeys.MediaPreviousTrack,
Keys.MediaPreviousTrack);
176 AddKeys(WinFormsKeys.MediaStop,
Keys.MediaStop);
177 AddKeys(WinFormsKeys.MediaPlayPause,
Keys.MediaPlayPause);
178 AddKeys(WinFormsKeys.LaunchMail,
Keys.LaunchMail);
179 AddKeys(WinFormsKeys.SelectMedia,
Keys.SelectMedia);
180 AddKeys(WinFormsKeys.LaunchApplication1,
Keys.LaunchApplication1);
181 AddKeys(WinFormsKeys.LaunchApplication2,
Keys.LaunchApplication2);
182 AddKeys(WinFormsKeys.Oem1,
Keys.Oem1);
183 AddKeys(WinFormsKeys.OemSemicolon,
Keys.OemSemicolon);
184 AddKeys(WinFormsKeys.Oemplus,
Keys.OemPlus);
185 AddKeys(WinFormsKeys.Oemcomma,
Keys.OemComma);
186 AddKeys(WinFormsKeys.OemMinus,
Keys.OemMinus);
187 AddKeys(WinFormsKeys.OemPeriod,
Keys.OemPeriod);
188 AddKeys(WinFormsKeys.Oem2,
Keys.Oem2);
189 AddKeys(WinFormsKeys.OemQuestion,
Keys.OemQuestion);
190 AddKeys(WinFormsKeys.Oem3,
Keys.Oem3);
191 AddKeys(WinFormsKeys.Oemtilde,
Keys.OemTilde);
192 AddKeys(WinFormsKeys.Oem4,
Keys.Oem4);
193 AddKeys(WinFormsKeys.OemOpenBrackets,
Keys.OemOpenBrackets);
194 AddKeys(WinFormsKeys.Oem5,
Keys.Oem5);
195 AddKeys(WinFormsKeys.OemPipe,
Keys.OemPipe);
196 AddKeys(WinFormsKeys.Oem6,
Keys.Oem6);
197 AddKeys(WinFormsKeys.OemCloseBrackets,
Keys.OemCloseBrackets);
198 AddKeys(WinFormsKeys.Oem7,
Keys.Oem7);
199 AddKeys(WinFormsKeys.OemQuotes,
Keys.OemQuotes);
200 AddKeys(WinFormsKeys.Oem8,
Keys.Oem8);
201 AddKeys(WinFormsKeys.Oem102,
Keys.Oem102);
202 AddKeys(WinFormsKeys.OemBackslash,
Keys.OemBackslash);
203 AddKeys(WinFormsKeys.Attn,
Keys.Attn);
204 AddKeys(WinFormsKeys.Crsel,
Keys.CrSel);
205 AddKeys(WinFormsKeys.Exsel,
Keys.ExSel);
206 AddKeys(WinFormsKeys.EraseEof,
Keys.EraseEof);
207 AddKeys(WinFormsKeys.Play,
Keys.Play);
208 AddKeys(WinFormsKeys.Zoom,
Keys.Zoom);
209 AddKeys(WinFormsKeys.NoName,
Keys.NoName);
210 AddKeys(WinFormsKeys.Pa1,
Keys.Pa1);
211 AddKeys(WinFormsKeys.OemClear,
Keys.OemClear);
219 #if SILICONSTUDIO_PLATFORM_WINDOWS_STORE
220 GamePadFactories.Add(
new XInputGamePadFactory());
225 public override void Initialize()
229 var windowHandle = Game.Window.NativeWindow;
230 switch (windowHandle.Context)
232 case AppContextType.WindowsRuntime:
233 InitializeFromFrameworkElement((FrameworkElement)windowHandle.NativeHandle);
236 throw new ArgumentException(
string.Format(
"WindowContext [{0}] not supported", Game.Context.ContextType));
243 private void InitializeFromFrameworkElement(FrameworkElement uiElement)
247 uiElement.Loaded += uiElement_Loaded;
248 uiElement.Unloaded += uiElement_Unloaded;
252 uiElement.KeyDown += (_, e) => HandleKeyFrameworkElement(e, InputEventType.Down);
253 uiElement.KeyUp += (_, e) => HandleKeyFrameworkElement(e, InputEventType.Up);
256 uiElement.SizeChanged += (_, e) => HandleSizeChangedEvent(e.NewSize);
257 uiElement.PointerPressed += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Down);
258 uiElement.PointerReleased += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Up);
259 uiElement.PointerWheelChanged += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Move);
260 uiElement.PointerMoved += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Move);
261 uiElement.PointerExited += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Out);
262 uiElement.PointerCanceled += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Cancel);
263 uiElement.PointerCaptureLost += (_, e) => HandlePointerEventFrameworkElement(uiElement, e,
PointerState.Cancel);
270 while (uiElement != null)
272 var control = uiElement as Control;
273 if (control != null && control.Focus(FocusState.Programmatic))
276 control.KeyDown += (_, e2) => HandleKeyFrameworkElement(e2, InputEventType.Down);
277 control.KeyUp += (_, e2) => HandleKeyFrameworkElement(e2, InputEventType.Up);
281 uiElement = VisualTreeHelper.GetParent(uiElement);
290 private void InitializeFromCoreWindow(CoreWindow coreWindow)
292 coreWindow.SizeChanged += (_, args) => { HandleSizeChangedEvent(args.Size); args.Handled =
true; };
293 coreWindow.PointerPressed += (_, args) => HandlePointerEventCoreWindow(args,
PointerState.Down);
294 coreWindow.PointerReleased += (_, args) => HandlePointerEventCoreWindow(args,
PointerState.Up);
295 coreWindow.PointerWheelChanged += (_, args) => HandlePointerEventCoreWindow(args,
PointerState.Move);
296 coreWindow.PointerMoved += (_, args) => HandlePointerEventCoreWindow(args,
PointerState.Move);
297 coreWindow.PointerExited += (_, args) => HandlePointerEventCoreWindow(args,
PointerState.Out);
298 coreWindow.PointerCaptureLost += (_, args) => HandlePointerEventCoreWindow(args,
PointerState.Cancel);
300 coreWindow.KeyDown += (_, args) => HandleKeyCoreWindow(args, InputEventType.Down);
301 coreWindow.KeyUp += (_, args) => HandleKeyCoreWindow(args, InputEventType.Up);
304 private void HandleSizeChangedEvent(Size
size)
306 ControlHeight = (float)size.Height;
307 ControlWidth = (
float)size.Width;
310 private void HandleKeyFrameworkElement(KeyRoutedEventArgs args, InputEventType inputEventType)
312 if (HandleKey(args.Key, args.KeyStatus, inputEventType))
316 private void HandleKeyCoreWindow(KeyEventArgs args, InputEventType inputEventType)
318 if (HandleKey(args.VirtualKey, args.KeyStatus, inputEventType))
322 private bool HandleKey(VirtualKey virtualKey, CorePhysicalKeyStatus keyStatus, InputEventType type)
327 case VirtualKey.Shift:
329 virtualKey = keyStatus.ScanCode == 54 ? VirtualKey.RightShift : VirtualKey.LeftShift;
331 case VirtualKey.Control:
332 virtualKey = keyStatus.IsExtendedKey ? VirtualKey.RightControl : VirtualKey.LeftControl;
334 case VirtualKey.Menu:
335 virtualKey = keyStatus.IsExtendedKey ? VirtualKey.RightMenu : VirtualKey.LeftMenu;
340 if (virtualKey == VirtualKey.F4 && IsKeyDownNow(
Keys.LeftAlt))
344 if (!mapKeys.TryGetValue(virtualKey, out key))
347 lock (KeyboardInputEvents)
349 KeyboardInputEvents.Add(
new KeyboardInputEvent { Key = key,
Type = type });
355 private bool IsKeyDownNow(
Keys key)
358 lock (KeyboardInputEvents)
360 for (
int index = KeyboardInputEvents.Count - 1; index >= 0; --index)
362 var keyboardInputEvent = KeyboardInputEvents[index];
363 if (keyboardInputEvent.Key == key)
365 if (keyboardInputEvent.Type == InputEventType.Down)
367 if (keyboardInputEvent.Type == InputEventType.Up)
380 private void HandlePointerEventFrameworkElement(FrameworkElement uiElement, PointerRoutedEventArgs pointerRoutedEventArgs,
PointerState pointerState)
382 HandlePointerEvent(pointerRoutedEventArgs.GetCurrentPoint(uiElement), pointerState);
384 pointerRoutedEventArgs.Handled =
true;
387 private void HandlePointerEventCoreWindow(PointerEventArgs args,
PointerState pointerState)
389 HandlePointerEvent(args.CurrentPoint, pointerState);
394 void HandlePointerEvent(WinRTPointerPoint p,
PointerState ptrState)
396 var pointerType = ConvertPointerDeviceType(p.PointerDevice.PointerDeviceType);
397 var isMouse = pointerType == PointerType.Mouse;
398 var position = NormalizeScreenPosition(PointToVector2(p.Position));
407 for (
int i = 0; i < MouseButtonCurrentlyDown.Length; i++)
409 if (MouseButtonCurrentlyDown[i])
411 HandlePointerEvents(i, position,
PointerState.Out, pointerType);
412 MouseButtonCurrentlyDown[i] =
false;
421 MouseInputEvent mouseEvent;
426 var buttonId = (int)button;
427 if (!MouseButtonCurrentlyDown[buttonId] && MouseButtonIsPressed(p.Properties, button))
429 lock (MouseInputEvents)
431 mouseEvent =
new MouseInputEvent {
Type = InputEventType.Down,
MouseButton = button };
432 MouseInputEvents.Add(mouseEvent);
435 HandlePointerEvents(buttonId, position,
PointerState.Down, pointerType);
437 MouseButtonCurrentlyDown[buttonId] =
true;
442 if (CurrentMousePosition != position)
446 var buttonId = (int)button;
447 if (MouseButtonCurrentlyDown[buttonId])
448 HandlePointerEvents(buttonId, position,
PointerState.Move, pointerType);
455 var buttonId = (int)button;
456 if (MouseButtonCurrentlyDown[buttonId] && !MouseButtonIsPressed(p.Properties, button))
458 lock (MouseInputEvents)
460 mouseEvent =
new MouseInputEvent {
Type = InputEventType.Up,
MouseButton = button };
461 MouseInputEvents.Add(mouseEvent);
464 HandlePointerEvents(buttonId, position,
PointerState.Up, pointerType);
466 MouseButtonCurrentlyDown[buttonId] =
false;
471 if (Math.Abs(p.Properties.MouseWheelDelta) > MathUtil.ZeroTolerance)
473 lock (MouseInputEvents)
475 mouseEvent =
new MouseInputEvent {
Type = InputEventType.Wheel,
MouseButton = MouseButton.Middle,
Value = p.Properties.MouseWheelDelta };
476 MouseInputEvents.Add(mouseEvent);
482 CurrentMousePosition = position;
486 HandlePointerEvents((
int)p.PointerId, position, ptrState, pointerType);
490 private bool MouseButtonIsPressed(PointerPointProperties mouseProperties,
MouseButton button)
494 case MouseButton.Left:
495 return mouseProperties.IsLeftButtonPressed;
496 case MouseButton.Middle:
497 return mouseProperties.IsMiddleButtonPressed;
498 case MouseButton.Right:
499 return mouseProperties.IsRightButtonPressed;
500 case MouseButton.Extended1:
501 return mouseProperties.IsXButton1Pressed;
502 case MouseButton.Extended2:
503 return mouseProperties.IsXButton2Pressed;
505 throw new ArgumentOutOfRangeException(
"button");
509 private PointerType ConvertPointerDeviceType(WinRTPointerDeviceType deviceType)
513 case WinRTPointerDeviceType.Mouse:
514 return PointerType.Mouse;
515 case WinRTPointerDeviceType.Pen:
516 throw new NotSupportedException(
"Pen device input is not supported.");
517 case WinRTPointerDeviceType.Touch:
518 return PointerType.Touch;
520 return PointerType.Unknown;
525 return new Vector2((
float)point.X, (
float)point.Y);
528 private static void AddKeys(WinFormsKeys fromKey,
Keys toKey)
530 if (!mapKeys.ContainsKey((VirtualKey)fromKey))
532 mapKeys.Add((VirtualKey)fromKey, toKey);
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
SiliconStudio.Core.IServiceRegistry IServiceRegistry
SiliconStudio.Paradox.Input.Keys Keys
The type of the serialized type will be passed as a generic arguments of the serializer. Example: serializer of A becomes instantiated as Serializer{A}.
_In_ size_t _In_ size_t size
System.Windows.Point Point