protected virtual IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (_Game != null && _Game.ProcessHooked) { try { Logger.WriteLog("KeyboardHook Event : wParam = 0x " + wParam.ToString("X8") + ", lParam = 0x" + lParam.ToString("X8")); //First step : use the Hook to determine if a virtual Middle/Right button has been pushed if ((UInt32)wParam == Win32Define.WM_KEYDOWN) { Logger.WriteLog("KeyboardHook Event : WM_KEYDOWN event detected"); KBDLLHOOKSTRUCT s = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); Logger.WriteLog("KBDLLHOOKSTRUCT : " + s.ToString()); foreach (PlayerSettings Player in _Configurator.PlayersSettings) { if (Player.isVirtualMouseButtonsEnabled && Player.RIController != null) { if (s.scanCode == Player.DIK_VirtualMouseButton_Left) { Logger.WriteLog("Player " + Player.ID + "VirtualMouseButton_Left detected"); Player.RIController.Computed_Buttons = RawInputcontrollerButtonEvent.OnScreenTriggerDown; _Game.SendInput(Player); } else if (s.scanCode == Player.DIK_VirtualMouseButton_Middle) { Logger.WriteLog("Player " + Player.ID + "VirtualMouseButton_Middle detected"); Player.RIController.Computed_Buttons = RawInputcontrollerButtonEvent.ActionDown; _Game.SendInput(Player); } else if (s.scanCode == Player.DIK_VirtualMouseButton_Right) { Logger.WriteLog("Player " + Player.ID + "VirtualMouseButton_Right detected"); Player.RIController.Computed_Buttons = RawInputcontrollerButtonEvent.OffScreenTriggerDown; _Game.SendInput(Player); } } } Logger.WriteLog("-"); } if ((UInt32)wParam == Win32Define.WM_KEYUP) { Logger.WriteLog("KeyboardHook Event : WM_KEYUP event detected"); KBDLLHOOKSTRUCT s = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); Logger.WriteLog("KBDLLHOOKSTRUCT : " + s.ToString()); foreach (PlayerSettings Player in _Configurator.PlayersSettings) { if (Player.isVirtualMouseButtonsEnabled && Player.RIController != null) { if (s.scanCode == Player.DIK_VirtualMouseButton_Left) { Logger.WriteLog("Player " + Player.ID + "VirtualMouseButton_Left detected"); Player.RIController.Computed_Buttons = RawInputcontrollerButtonEvent.OnScreenTriggerUp; _Game.SendInput(Player); } else if (s.scanCode == Player.DIK_VirtualMouseButton_Middle) { Logger.WriteLog("Player " + Player.ID + "VirtualMouseButton_Middle detected"); Player.RIController.Computed_Buttons = RawInputcontrollerButtonEvent.ActionUp; _Game.SendInput(Player); } else if (s.scanCode == Player.DIK_VirtualMouseButton_Right) { Logger.WriteLog("Player " + Player.ID + "VirtualMouseButton_Right detected"); Player.RIController.Computed_Buttons = RawInputcontrollerButtonEvent.OffScreenTriggerUp; _Game.SendInput(Player); } } } Logger.WriteLog("-"); } //Second step : forward the event to the Game return(_Game.KeyboardHookCallback(_MouseHookID, nCode, wParam, lParam)); } catch (Exception Ex) { Logger.WriteLog("Error handling KeyboardHookCallback : " + Ex.Message.ToString()); return(_Game.KeyboardHookCallback(_MouseHookID, nCode, wParam, lParam)); } } else { return(Win32API.CallNextHookEx(_KeyboardHookID, nCode, wParam, lParam)); } }