mirror of
https://gitea.tendokyu.moe/TeamTofuShop/taitools.git
synced 2026-09-22 22:28:06 +03:00
rawinput changes
This commit is contained in:
@@ -3,7 +3,6 @@
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <hidsdi.h>
|
||||
#include <process.h>
|
||||
|
||||
#include "hook/iohook.h"
|
||||
@@ -13,9 +12,17 @@
|
||||
|
||||
static HWND ri_hwnd;
|
||||
static WNDCLASSEX ri_wndclass;
|
||||
static HANDLE selected_ri_dev = (HANDLE)-1;
|
||||
static uintptr_t ri_thread;
|
||||
|
||||
static struct RI_DEVICE selected_ri_dev =
|
||||
{
|
||||
.hDevice = INVALID_HANDLE_VALUE,
|
||||
.capeabilities = NULL,
|
||||
.preparsed_data = NULL,
|
||||
.prod_name = L"",
|
||||
.dev_name = L""
|
||||
};
|
||||
|
||||
static ri_mouse_cb_t mouse_cb = NULL;
|
||||
static ri_kb_cb_t kb_cb = NULL;
|
||||
static ri_hid_cb_t hid_cb = NULL;
|
||||
@@ -27,10 +34,15 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
|
||||
{
|
||||
wchar_t ri_dev_name[MAX_PATH] = L"\0";
|
||||
wchar_t hid_prod_name[MAX_PATH] = L"\0";
|
||||
PHIDP_PREPARSED_DATA ppdata = NULL;
|
||||
PHIDP_CAPS caps = NULL;
|
||||
UINT num_ri_devs = 0;
|
||||
UINT len_ri_dev_name = 0;
|
||||
UINT len_ri_preparsed_data = 0;
|
||||
DWORD err = 0;
|
||||
PRAWINPUTDEVICELIST ri_devs = NULL;
|
||||
uint32_t num_final_devs = 0;
|
||||
PRI_DEVICE final_dev_list;
|
||||
|
||||
mouse_cb = in_mouse_cb;
|
||||
kb_cb = in_kb_cb;
|
||||
@@ -55,6 +67,32 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
|
||||
dprintf("RawInput: Raw Input device list (%d devices):\n", num_ri_devs);
|
||||
for (int i = 0; i < num_ri_devs; i++) {
|
||||
len_ri_dev_name = 0;
|
||||
len_ri_preparsed_data = 0;
|
||||
if (GetRawInputDeviceInfo(ri_devs[i].hDevice, RIDI_PREPARSEDDATA, NULL, &len_ri_preparsed_data) != 0) {
|
||||
dprintf("RawInput: GetRawInputDeviceInfo #%d failed to get preprocessed data size\n", i);
|
||||
break;
|
||||
}
|
||||
|
||||
if (len_ri_preparsed_data <= 0) {
|
||||
dprintf("RawInput: GetRawInputDeviceInfoW #%d len_ri_preparsed_data <= 0\n", i);
|
||||
break;
|
||||
}
|
||||
|
||||
if (GetRawInputDeviceInfo(ri_devs[i].hDevice, RIDI_PREPARSEDDATA, ppdata, &len_ri_preparsed_data) != 0) {
|
||||
dprintf("RawInput: GetRawInputDeviceInfo #%d failed to get preprocessed data\n", i);
|
||||
break;
|
||||
}
|
||||
|
||||
if (HidP_GetCaps(ppdata, caps) != HIDP_STATUS_SUCCESS) {
|
||||
dprintf("RawInput: HidP_GetCaps #%d failed to get capeabilities data size\n", i);
|
||||
break;
|
||||
}
|
||||
|
||||
if ((caps->UsagePage >> 8) == 0xFF) {
|
||||
dprintf("RawInput: Skipping vendor-specific device #%d\n", i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (GetRawInputDeviceInfoW(ri_devs[i].hDevice, RIDI_DEVICENAME, NULL, &len_ri_dev_name) != 0) {
|
||||
dprintf("RawInput: GetRawInputDeviceInfoW #%d failed to get name size\n", i);
|
||||
break;
|
||||
@@ -83,16 +121,37 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
|
||||
}
|
||||
|
||||
if (!HidD_GetProductString(hiddev, hid_prod_name, MAX_PATH)) {
|
||||
//dprintf("RawInput: HidD_GetProductString failed on dev #%d for device %ls\n", i, ri_dev_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
PRI_DEVICE new_dev;
|
||||
PRI_DEVICE new_mem = realloc(final_dev_list, (num_final_devs + 1) * sizeof(struct RI_DEVICE));
|
||||
|
||||
dprintf("\tDev #%d - %ls\n", i, hid_prod_name);
|
||||
new_dev = &new_mem[num_final_devs];
|
||||
new_dev->hDevice = ri_devs[i].hDevice;
|
||||
// does this need memcpy?
|
||||
new_dev->capeabilities = caps;
|
||||
new_dev->preparsed_data = ppdata;
|
||||
new_dev->dev_name = ri_dev_name;
|
||||
new_dev->prod_name = hid_prod_name;
|
||||
|
||||
final_dev_list = new_mem;
|
||||
num_final_devs++;
|
||||
}
|
||||
|
||||
if (dev_num >= num_final_devs) {
|
||||
dprintf("RawInput: No RawInput device set, please select from the list below:\n");
|
||||
for (int i = 0; i < num_final_devs; i++) {
|
||||
dprintf("\tDev #%d - %ls\n", i, hid_prod_name);
|
||||
}
|
||||
|
||||
free(ri_devs);
|
||||
free(final_dev_list);
|
||||
return S_FALSE;
|
||||
}
|
||||
|
||||
selected_ri_dev = ri_devs[dev_num].hDevice;
|
||||
|
||||
free(ri_devs);
|
||||
selected_ri_dev = final_dev_list[dev_num];
|
||||
dprintf("RawInput: Using device %ls\n", selected_ri_dev.prod_name);
|
||||
|
||||
ri_wndclass.cbSize = sizeof(WNDCLASSEX);
|
||||
ri_wndclass.hInstance = GetModuleHandle(NULL);
|
||||
@@ -101,13 +160,10 @@ HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb,
|
||||
|
||||
RegisterClassEx(&ri_wndclass);
|
||||
|
||||
ri_thread = _beginthreadex(
|
||||
NULL,
|
||||
0,
|
||||
ri_thread_proc,
|
||||
NULL,
|
||||
0,
|
||||
NULL);
|
||||
ri_thread = _beginthreadex(NULL, 0, ri_thread_proc, NULL, 0, NULL);
|
||||
|
||||
free(ri_devs);
|
||||
free(final_dev_list);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -120,6 +176,11 @@ void ri_exit()
|
||||
|
||||
static unsigned int __stdcall ri_thread_proc(void *ctx)
|
||||
{
|
||||
if (selected_ri_dev.hDevice == INVALID_HANDLE_VALUE) {
|
||||
dprintf("RawInput: ri_thread_proc cannont begin, no device selected\n");
|
||||
return (LRESULT)0;
|
||||
}
|
||||
|
||||
dprintf("RawInput: ri_thread_proc begin\n");
|
||||
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
|
||||
|
||||
@@ -174,7 +235,7 @@ LRESULT CALLBACK ri_win_proc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lParam)
|
||||
PRAWINPUT ridata = (PRAWINPUT)malloc(pdata_size);
|
||||
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, ridata, &pdata_size, sizeof(RAWINPUTHEADER));
|
||||
|
||||
if (ridata->header.hDevice != selected_ri_dev) {
|
||||
if (ridata->header.hDevice != selected_ri_dev.hDevice) {
|
||||
free(ridata);
|
||||
return (LRESULT)0;
|
||||
}
|
||||
@@ -182,17 +243,17 @@ LRESULT CALLBACK ri_win_proc(HWND hWnd, UINT msg, WPARAM wparam, LPARAM lParam)
|
||||
switch (ridata->header.dwType) {
|
||||
case RIM_TYPEMOUSE:
|
||||
if (mouse_cb != NULL) {
|
||||
mouse_cb(&ridata->data.mouse);
|
||||
mouse_cb(&selected_ri_dev, &ridata->data.mouse);
|
||||
}
|
||||
break;
|
||||
case RIM_TYPEKEYBOARD:
|
||||
if (kb_cb != NULL) {
|
||||
kb_cb(&ridata->data.keyboard);
|
||||
kb_cb(&selected_ri_dev, &ridata->data.keyboard);
|
||||
}
|
||||
break;
|
||||
case RIM_TYPEHID:
|
||||
if (hid_cb != NULL) {
|
||||
hid_cb(&ridata->data.hid);
|
||||
hid_cb(&selected_ri_dev, &ridata->data.hid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,10 +1,22 @@
|
||||
#pragma once
|
||||
#include <windows.h>
|
||||
#include <stdint.h>
|
||||
#include <hidsdi.h>
|
||||
|
||||
typedef void (*ri_mouse_cb_t)(PRAWMOUSE);
|
||||
typedef void (*ri_kb_cb_t)(PRAWKEYBOARD);
|
||||
typedef void (*ri_hid_cb_t)(PRAWHID);
|
||||
|
||||
#pragma pack(push,1)
|
||||
typedef struct RI_DEVICE {
|
||||
HANDLE hDevice;
|
||||
PHIDP_PREPARSED_DATA preparsed_data;
|
||||
PHIDP_CAPS capeabilities;
|
||||
wchar_t *dev_name;
|
||||
wchar_t *prod_name;
|
||||
} *PRI_DEVICE;
|
||||
#pragma pack(pop)
|
||||
|
||||
typedef void (*ri_mouse_cb_t)(PRI_DEVICE, PRAWMOUSE);
|
||||
typedef void (*ri_kb_cb_t)(PRI_DEVICE, PRAWKEYBOARD);
|
||||
typedef void (*ri_hid_cb_t)(PRI_DEVICE, PRAWHID);
|
||||
|
||||
HRESULT ri_init(uint8_t dev_num, ri_mouse_cb_t in_mouse_cb, ri_kb_cb_t in_kb_cb, ri_hid_cb_t in_hid_cb);
|
||||
void ri_exit();
|
||||
|
||||
Reference in New Issue
Block a user