Skip to content

Instantly share code, notes, and snippets.

@kiran-kp
Created September 4, 2020 05:19
Show Gist options
  • Save kiran-kp/72740d28f1b9367c6bbdf8a4501b1217 to your computer and use it in GitHub Desktop.
Save kiran-kp/72740d28f1b9367c6bbdf8a4501b1217 to your computer and use it in GitHub Desktop.
Hack trackball to simulate mousewheel
#include <Windows.h>
#include <iostream>
#include <chrono>
HHOOK mhook;
MSG msg;
bool forwardButtonHeld = false;
long mouseX = 0;
long mouseY = 0;
std::chrono::time_point<std::chrono::high_resolution_clock> forwardDownTime;
LRESULT WINAPI LLMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
void InstallHook() {
if (!(mhook = SetWindowsHookEx(WH_MOUSE_LL, LLMouseProc, NULL, 0))) {
printf_s("Error: %x \n", GetLastError());
}
}
void UninstallHook() {
UnhookWindowsHookEx(mhook);
}
LRESULT WINAPI LLMouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
MSLLHOOKSTRUCT* pMouseStruct = (MSLLHOOKSTRUCT*)lParam;
switch (wParam) {
case WM_MOUSEMOVE: {
if (pMouseStruct != NULL) {
long newX = pMouseStruct->pt.x;
long newY = pMouseStruct->pt.y;
if (mouseX == 0 && mouseY == 0) {
mouseX = newX;
mouseY = newY;
}
if (forwardButtonHeld) {
UninstallHook();
long diff = mouseY - newY;
mouse_event(MOUSEEVENTF_WHEEL, 0, 0, diff, 0);
diff = newX - mouseX;
mouse_event(MOUSEEVENTF_HWHEEL, 0, 0, diff, 0);
InstallHook();
return -1;
}
else {
mouseX = newX;
mouseY = newY;
}
}
break;
}
case WM_XBUTTONDOWN: {
if (pMouseStruct != NULL) {
if ((pMouseStruct->mouseData >> 16) == 0x2) {
forwardButtonHeld = true;
forwardDownTime = std::chrono::high_resolution_clock::now();
return -1;
}
}
break;
}
case WM_XBUTTONUP: {
if (pMouseStruct != NULL) {
if ((pMouseStruct->mouseData >> 16) == 0x2) {
forwardButtonHeld = false;
auto now = std::chrono::high_resolution_clock::now();
if ((now - forwardDownTime).count() < std::chrono::nanoseconds(800000000).count()) {
UninstallHook();
mouse_event(MOUSEEVENTF_MIDDLEDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_MIDDLEUP, 0, 0, 0, 0);
InstallHook();
return -1;
}
}
}
break;
}
}
}
return CallNextHookEx(mhook, nCode, wParam, lParam);
}
int main() {
InstallHook();
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
UninstallHook();
return (int)msg.wParam;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment