protected override unsafe void HandleSubclassWindowMessage(object sender, WMEventArgs e) { if (e.Message >= WM.KEYFIRST && e.Message <= WM.KEYLAST) { var key = (Keys)e.WParam; var capsLock = Control.IsKeyLocked(Keys.CapsLock); var time = User32.GetMessageTime(); var chars = Enumerable.Empty <char>(); var keys = Enumerable.Empty <Keys>(); switch (e.Message) { case WM.KEYDOWN: case WM.SYSKEYDOWN: keys = FKeyboardState.KeyCodes.Concat(new[] { key }); break; case WM.CHAR: case WM.SYSCHAR: chars = new[] { (char)e.WParam }; keys = FKeyboardState.KeyCodes; break; case WM.KEYUP: case WM.SYSKEYUP: keys = FKeyboardState.KeyCodes.Except(new[] { key }); break; } FKeyboardState = new KeyboardState(keys, chars, capsLock, time); } }
private IEnumerable <TouchNotification> GenerateTouchNotifications(WMEventArgs e) { var touchPointCount = e.WParam.LoWord(); if (touchPointCount > 0) { var touchPoints = new TOUCHINPUT[touchPointCount]; if (User32.GetTouchInputInfo(e.LParam, touchPointCount, touchPoints, Marshal.SizeOf(typeof(TOUCHINPUT)))) { e.Handled = true; try { RECT cr; if (User32.GetClientRect(e.HWnd, out cr)) { foreach (var touchPoint in touchPoints) { var position = new Point(touchPoint.x / 100, touchPoint.y / 100); User32.ScreenToClient(e.HWnd, ref position); var clientArea = new Size(cr.Width, cr.Height); var id = touchPoint.dwID; var primary = (touchPoint.dwFlags & Const.TOUCHEVENTF_PRIMARY) > 0; var contactArea = (touchPoint.dwMask & Const.TOUCHINPUTMASKF_CONTACTAREA) > 0 ? new Size(touchPoint.cxContact / 100, touchPoint.cyContact / 100) : Size.Empty; if ((touchPoint.dwFlags & Const.TOUCHEVENTF_DOWN) > 0) { yield return(new TouchDownNotification(position, clientArea, id, primary, contactArea, touchPoint.hSource.ToInt64())); } if ((touchPoint.dwFlags & Const.TOUCHEVENTF_MOVE) > 0) { yield return(new TouchMoveNotification(position, clientArea, id, primary, contactArea, touchPoint.hSource.ToInt64())); } if ((touchPoint.dwFlags & Const.TOUCHEVENTF_UP) > 0) { yield return(new TouchUpNotification(position, clientArea, id, primary, contactArea, touchPoint.hSource.ToInt64())); } } } } finally { User32.CloseTouchInputHandle(e.LParam); } } } yield break; }
protected override void HandleSubclassWindowMessage(object sender, WMEventArgs e) { if (e.Message >= WM.MOUSEFIRST && e.Message <= WM.MOUSELAST) { switch (e.Message) { case WM.MOUSEWHEEL: unchecked { var wheel = e.WParam.ToInt32().HiWord(); FMouseWheel += wheel; FMouseState.MouseWheel = (int)Math.Round((float)FMouseWheel / Const.WHEEL_DELTA); } break; case WM.MOUSEMOVE: RECT cr; if (User32.GetClientRect(e.HWnd, out cr)) { var pos = e.LParam.ToInt32(); var x = (int)pos.LoWord(); var y = (int)pos.HiWord(); var width = cr.Width; var height = cr.Height; FMouseState.X = 2d * x / (width - 1) - 1; FMouseState.Y = 1d - 2d * y / (height - 1); } break; case WM.LBUTTONDOWN: case WM.LBUTTONDBLCLK: case WM.LBUTTONUP: case WM.MBUTTONDOWN: case WM.MBUTTONDBLCLK: case WM.MBUTTONUP: case WM.RBUTTONDOWN: case WM.RBUTTONDBLCLK: case WM.RBUTTONUP: case WM.XBUTTONDOWN: case WM.XBUTTONDBLCLK: case WM.XBUTTONUP: FMouseState.Buttons = Control.MouseButtons; break; } } }
private static WM ApplyTabHack(WMEventArgs a) { var msg = a.Message; var filteredMsg = msg & (WM)0x01FF; switch (filteredMsg) { case WM.KEYDOWN: case WM.SYSKEYDOWN: case WM.CHAR: case WM.SYSCHAR: case WM.KEYUP: case WM.SYSKEYUP: // Check again that it's not the real message switch (msg) { case WM.KEYDOWN: case WM.SYSKEYDOWN: case WM.CHAR: case WM.SYSCHAR: case WM.KEYUP: case WM.SYSKEYUP: break; default: // Indeed the weired one - check for tab only if ((Keys)a.WParam == Keys.Tab) { return(filteredMsg); } break; } break; } return(msg); }
private IEnumerable <GestureNotification> GenerateGestureNotifications(WMEventArgs e) { if (e.Message == WM.GESTURENOTIFY) { e.Handled = FEnabledIn[0]; yield break; } else { var gestureInfo = new GESTUREINFO(); gestureInfo.cbSize = FGestureInfoSize; if (User32.GetGestureInfo(e.LParam, ref gestureInfo)) { try { RECT cr; if (User32.GetClientRect(e.HWnd, out cr)) { var position = new Point(gestureInfo.x, gestureInfo.y); User32.ScreenToClient(e.HWnd, ref position); e.Handled = true; switch ((GestureNotificationKind)gestureInfo.dwID) { case GestureNotificationKind.GestureBegin: yield return(new GestureBeginNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; case GestureNotificationKind.GestureEnd: yield return(new GestureEndNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; case GestureNotificationKind.GestureZoom: yield return(new GestureZoomNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; case GestureNotificationKind.GesturePan: yield return(new GesturePanNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; case GestureNotificationKind.GestureRotate: yield return(new GestureRotateNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; case GestureNotificationKind.GesturePressAndTap: yield return(new GesturePressAndTapNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; case GestureNotificationKind.GestureTwoFingerTap: yield return(new GestureTwoFingerTapNotification(position, new Size(cr.Width, cr.Height), gestureInfo.dwInstanceID, gestureInfo.dwSequenceID, gestureInfo.hwndTarget.ToInt64(), gestureInfo.dwFlags, gestureInfo.ullArguments, gestureInfo.cbExtraArgs)); break; default: yield break; } } } finally { e.Handled = false; } } yield break; } }
protected abstract void HandleSubclassWindowMessage(object sender, WMEventArgs e);