/// <summary> /// consume an ActionArgs send from ActionRecogniser /// </summary> /// <param name="sender">the action manager</param> /// <param name="a">the action detected</param> private void Event_ActionRecognised(object sender, ActionArgs a) { ActionName previousActionName = ActionName.NULL; String activeWindow = NativeMethods.GetActiveWindow(); if (previousActionsQueue.Count > 1) { previousActionName = previousActionsQueue.ToArray()[previousActionsQueue.Count - 1]; } if (! (previousActionsQueue.Count >= 1 && previousActionName == ActionName.IDLE && a.name == ActionName.IDLE || (previousActionsQueue.Count > 1 && previousActionName == ActionName.MOUSE_PRESS && a.name == ActionName.MOUSE_PRESS) || (previousActionsQueue.Count > 1 && previousActionName != ActionName.MOUSE_PRESS && a.name == ActionName.MOUSE_RELEASE) || (previousActionsQueue.Count >= 1 && previousActionName == ActionName.MENU && a.name == ActionName.MENU)) && !Helper.disabledActions.Contains(a.name) ) { LogHelper.logInput("Action Recognised : \r\n" + a.ToString(), LogHelper.logType.INFO, this); if (previousActiveWindow == null || !previousActiveWindow.Equals(activeWindow)) { LogHelper.logInput("Current window : " + activeWindow, LogHelper.logType.INFO, this); previousActiveWindow = activeWindow; } previousActionsQueue.Enqueue(a.name); if (previousActionsQueue.Count == maxActionsNumber) { previousActionsQueue.Dequeue(); } if (!String.IsNullOrEmpty(activeWindow) && activeWindow.ToLower().Contains("firefox") && !ServerHelper.isKeyboardLaunched) { ServerHelper.Send(new Message(a)); } else { switch (a.name) { case ActionName.OPEN: MouseSimulator.LeftButtonClick(); MouseSimulator.LeftButtonClick(); break; case ActionName.NEXT_SELECTION: case ActionName.NEXT_TAB: KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.RIGHT); break; case ActionName.PREVIOUS_SELECTION: case ActionName.PREVIOUS_TAB: KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.LEFT); break; case ActionName.REDO: KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.VK_Y); KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); break; case ActionName.UNDO: KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.VK_Z); KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); break; default: break; } } //NOT DEPENDING ON THE ACTIVE WINDOW switch (a.name) { case ActionName.CLOSE: //if the virtual keyboard is up, kill it if (ServerHelper.isKeyboardLaunched) { ServerHelper.keyboardProcess.Kill(); ServerHelper.keyboardProcess = null; ServerHelper.isKeyboardLaunched = false; Helper.RemoveDisabledActions(new List <ActionName>() { ActionName.NEXT_TAB, ActionName.PREVIOUS_TAB }); } else { KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LMENU); KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.F4); KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LMENU); } break; case ActionName.SIMPLE_SELECTION: MouseSimulator.LeftButtonClick(); break; case ActionName.MENU: KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LWIN); KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.TAB); KeyboardSimulator.NokeyDown(); break; case ActionName.MOUSE_PRESS: if (!ServerHelper.isKeyboardLaunched) { clickTimer = new Timer(Click, null, 800, System.Threading.Timeout.Infinite); } break; case ActionName.MOUSE_RELEASE: if (isPressing == false) { MouseSimulator.LeftButtonClick(); ServerHelper.Send(new Message(new ActionArgs(ActionName.SIMPLE_SELECTION, Helper.GetTimeStamp(), a.events))); } else if (isPressing == true) { MouseSimulator.LeftButtonUp(); isPressing = false; } if (clickTimer != null) { clickTimer.Dispose(); } break; case ActionName.MULTIPLE_SELECTION: if (KeyboardSimulator.keyDownList != null && !KeyboardSimulator.keyDownList.Contains(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL)) { KeyboardSimulator.KeyDown(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); } else { KeyboardSimulator.KeyUp(StandardHelper.Inputcore.WordsVirtualKey.LCONTROL); } break; case ActionName.SCROLL_DOWN: MouseSimulator.VerticalMouseWheel(-5); break; case ActionName.SCROLL_UP: MouseSimulator.VerticalMouseWheel(5); break; case ActionName.EXIT: //reset Kinect if (KinectHelper.Instance.elevationAngle != 0) { KinectHelper.Instance.elevationAngle = 0; } //reset KeyBoard & Mouse InputControler.KeyboardSimulator.NokeyDown(); //kill the osk process if it exists if (ServerHelper.keyboardProcess != null) { ServerHelper.keyboardProcess.Kill(); } //Exit Environment.Exit(0); break; case ActionName.IDLE: //what to do depending on the previous action if (previousActionsQueue.Count != 0) { switch (previousActionsQueue.Peek()) { case ActionName.PREVIOUS_SELECTION: case ActionName.NEXT_SELECTION: case ActionName.MENU: InputControler.KeyboardSimulator.KeyHit(StandardHelper.Inputcore.WordsVirtualKey.EXECUTE); break; default: break; } } //release all entries InputControler.KeyboardSimulator.NokeyDown(); break; default: break; } } }