private void ProcessAxisAction(ActionAttribute action, double value, double prevValue) { const double IGNORE_THD = 0.05; var pressing = action.Incremental.GetValueOrDefault(defaultValue: false) && Math.Abs(value) > IGNORE_THD; var pressed = Math.Abs(value) > IGNORE_THD && Math.Abs(prevValue) <= IGNORE_THD; var released = Math.Abs(value) <= IGNORE_THD && Math.Abs(prevValue) > IGNORE_THD; var delay = action.Delay.GetValueOrDefault(defaultValue: 0); if (action.Type == ActionType.Keyboard) { var key = action.Key; var modKey = action.ModifierKey; bool sendModKey = modKey != null && m_vkcodes.Contains(modKey) && pressed; if (m_vkcodes.Contains(key) && (pressing || pressed || released)) { Task.Run(() => { Thread.Sleep(delay); if (sendModKey) { WinAPI.keybd_event(m_vkcodes[modKey], 0, 0, UIntPtr.Zero); } WinAPI.keybd_event(m_vkcodes[key], 0, released ? WinAPI.KEYEVENTF_KEYUP : 0, UIntPtr.Zero); if (sendModKey) { WinAPI.keybd_event(m_vkcodes[modKey], 0, WinAPI.KEYEVENTF_KEYUP, UIntPtr.Zero); } }); } return; } var pos = Cursor.Position; var mouseAction = action.MouseAction; var actionValue = action.Value; Task.Run(() => { Thread.Sleep(delay); switch (mouseAction) { case MouseAction.LeftClick: if (pressing || pressed || released) { WinAPI.mouse_event(released ? WinAPI.MOUSEEVENTF_LEFTUP : WinAPI.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); } break; case MouseAction.RightClick: if (pressing || pressed || released) { WinAPI.mouse_event(released ? WinAPI.MOUSEEVENTF_RIGHTUP : WinAPI.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0); } break; case MouseAction.MiddleClick: if (pressing || pressed || released) { WinAPI.mouse_event(released ? WinAPI.MOUSEEVENTF_MIDDLEUP : WinAPI.MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0); } break; case MouseAction.MoveDx: WinAPI.mouse_event(WinAPI.MOUSEEVENTF_MOVE, (int)(actionValue.GetValueOrDefault(defaultValue: 1) * value), 0, 0, 0); break; case MouseAction.MoveDy: WinAPI.mouse_event(WinAPI.MOUSEEVENTF_MOVE, 0, (int)(actionValue.GetValueOrDefault(defaultValue: 1) * value), 0, 0); break; case MouseAction.MoveX: if (pressing || pressed || released) { Cursor.Position = new System.Drawing.Point(actionValue.GetValueOrDefault(defaultValue: pos.X), pos.Y); } break; case MouseAction.MoveY: if (pressing || pressed || released) { Cursor.Position = new System.Drawing.Point(pos.X, actionValue.GetValueOrDefault(defaultValue: pos.Y)); } break; case MouseAction.ScrollWheel: WinAPI.mouse_event(WinAPI.MOUSEEVENTF_WHEEL, 0, 0, (int)(actionValue.GetValueOrDefault(defaultValue: 1) * value), 0); break; default: break; } }); }
/// <summary> /// 指定されたactionに基づく動作を実行します。 /// </summary> private void ProcessButtonAction(ActionAttribute action, bool state, bool prevState) { var pressing = action.Incremental.GetValueOrDefault(defaultValue: false) && state; var pressed = !prevState && state; var released = prevState && !state; if (!pressing && !pressed && !released) { return; } var delay = action.Delay.GetValueOrDefault(defaultValue: 0); if (action.Type == ActionType.Keyboard) { var key = action.Key; var modKey = action.ModifierKey; bool sendModKey = modKey != null && m_vkcodes.Contains(modKey) && pressed; if (m_vkcodes.Contains(key)) { Task.Run(() => { Thread.Sleep(delay); if (sendModKey) { WinAPI.keybd_event(m_vkcodes[modKey], 0, 0, UIntPtr.Zero); m_debugInfo.LogWriteLine("modKey press"); } WinAPI.keybd_event(m_vkcodes[key], 0, released ? WinAPI.KEYEVENTF_KEYUP : 0, UIntPtr.Zero); if (sendModKey) { WinAPI.keybd_event(m_vkcodes[modKey], 0, WinAPI.KEYEVENTF_KEYUP, UIntPtr.Zero); m_debugInfo.LogWriteLine("modKey release"); } }); } return; } var pos = Cursor.Position; var value = action.Value; var mouseAction = action.MouseAction; Task.Run(() => { Thread.Sleep(delay); switch (mouseAction) { case MouseAction.LeftClick: WinAPI.mouse_event(released ? WinAPI.MOUSEEVENTF_LEFTUP : WinAPI.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); break; case MouseAction.RightClick: WinAPI.mouse_event(released ? WinAPI.MOUSEEVENTF_RIGHTUP : WinAPI.MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0); break; case MouseAction.MiddleClick: WinAPI.mouse_event(released ? WinAPI.MOUSEEVENTF_MIDDLEUP : WinAPI.MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0); break; case MouseAction.MoveDx: if (!released) { WinAPI.mouse_event(WinAPI.MOUSEEVENTF_MOVE, value.GetValueOrDefault(defaultValue: 0), 0, 0, 0); } break; case MouseAction.MoveDy: if (!released) { WinAPI.mouse_event(WinAPI.MOUSEEVENTF_MOVE, 0, value.GetValueOrDefault(defaultValue: 0), 0, 0); } break; case MouseAction.MoveX: if (pressed) { Cursor.Position = new System.Drawing.Point(value.GetValueOrDefault(defaultValue: pos.X), pos.Y); } break; case MouseAction.MoveY: if (pressed) { Cursor.Position = new System.Drawing.Point(pos.X, value.GetValueOrDefault(defaultValue: pos.Y)); } break; case MouseAction.ScrollWheel: if (!released) { WinAPI.mouse_event(WinAPI.MOUSEEVENTF_WHEEL, 0, 0, value.GetValueOrDefault(defaultValue: 0), 0); } break; default: break; } }); }