Files
pcsx2/plugins/LilyPad/KeyboardHook.cpp
T
mattmenke 3a0ad40159 LilyPad: Experimental deadzone code. Old pressure sensitive button bindings must be rebound (DS3 buttons, XInput triggers).
Currently anything below deadzone is mapped to 0.  deadzone and above are mapped as if the control's true zero is 0 and 1/sensitivity is fully down (As opposed to deadzone being zero).  May change in the future.
Modified precompiled header to fix no-CRT build.
List of bindings noew automatically jumps to new bindings.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@1914 96395faa-99c1-11dd-bbfe-3dabce05a288
2009-09-25 08:36:42 +00:00

129 lines
3.5 KiB
C++

#include "Global.h"
#include "InputManager.h"
#include "Config.h"
#include "KeyboardHook.h"
#include "WindowsKeyboard.h"
#include "VKey.h"
#include "WndProcEater.h"
extern HINSTANCE hInst;
LRESULT CALLBACK IgnoreKeyboardHook(int code, WPARAM wParam, LPARAM lParam);
ExtraWndProcResult StartHooksWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output);
class IgnoreKeyboardHookDevice;
static IgnoreKeyboardHookDevice *ikhd = 0;
class IgnoreKeyboardHookDevice : public WindowsKeyboard {
public:
HHOOK hHook;
// When binding, eat all keys
int binding;
IgnoreKeyboardHookDevice() : WindowsKeyboard(IGNORE_KEYBOARD, L"Ignore Keyboard") {
// Don't want to send keypress/keyrelease messages.
for (int i=0; i<numPhysicalControls; i++) {
physicalControls[i].vkey = 0;
}
hHook = 0;
}
int Update() {
// So I'll bind to left/right control/shift instead of generic ones.
virtualControlState[VK_SHIFT] = 0;
virtualControlState[VK_CONTROL] = 0;
virtualControlState[VK_MENU] = 0;
return 1;
}
int Activate(InitInfo *initInfo) {
if (ikhd) ikhd->Deactivate();
binding = initInfo->bindingIgnore;
if (initInfo->hWndButton)
EatWndProc(initInfo->hWndButton, StartHooksWndProc, EATPROC_NO_UPDATE_WHILE_UPDATING_DEVICES);
else
EatWndProc(initInfo->hWnd, StartHooksWndProc, EATPROC_NO_UPDATE_WHILE_UPDATING_DEVICES);
InitState();
ikhd = this;
active = 1;
return 1;
}
void Deactivate() {
FreeState();
if (active) {
if (hHook) {
UnhookWindowsHookEx(hHook);
hHook = 0;
}
if (ikhd == this) ikhd = 0;
active = 0;
}
}
};
void EnumHookDevices() {
dm->AddDevice(new IgnoreKeyboardHookDevice());
}
// Makes sure hooks are started in correct thread.
ExtraWndProcResult StartHooksWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *output) {
// Don't remove too quickly - could be other things happening in other threads.
// Attempted fix for keyboard input occasionally not working.
static int counter = 0;
if (ikhd && !ikhd->hHook && ikhd->active) {
counter = 0;
ikhd->hHook = SetWindowsHookEx(WH_KEYBOARD_LL, IgnoreKeyboardHook, hInst, 0);
if (ikhd->hHook == 0) ikhd->Deactivate();
}
counter ++;
if (counter % 1000 == 0)
return CONTINUE_BLISSFULLY_AND_RELEASE_PROC;
else
return CONTINUE_BLISSFULLY;
}
LRESULT CALLBACK IgnoreKeyboardHook(int code, WPARAM wParam, LPARAM lParam) {
HHOOK hHook = 0;
if (ikhd) {
hHook = ikhd->hHook;
if (hHook) {
if (code == HC_ACTION) {
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) {
KBDLLHOOKSTRUCT* key = (KBDLLHOOKSTRUCT*) lParam;
if (key->vkCode < 256) {
for (int i=0; i<ikhd->pads[0][0].numBindings; i++) {
if (ikhd->pads[0][0].bindings[i].controlIndex == key->vkCode) {
return 1;
}
}
if (ikhd->binding){
ikhd->UpdateKey(key->vkCode, 1);
return 1;
}
}
if (config.vistaVolume) {
if (key->vkCode == VK_VOLUME_DOWN) {
SetVolume(config.volume-3);
return 1;
}
if (key->vkCode == VK_VOLUME_UP) {
SetVolume(config.volume+3);
return 1;
}
}
}
else if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) {
KBDLLHOOKSTRUCT* key = (KBDLLHOOKSTRUCT*) lParam;
if (ikhd->binding && key->vkCode < 256)
ikhd->UpdateKey(key->vkCode, 0);
}
}
return CallNextHookEx(hHook, code, wParam, lParam);
}
}
return CallNextHookEx(hHook, code, wParam, lParam);
}