-
Notifications
You must be signed in to change notification settings - Fork 0
/
osu!TouchPad.cpp
89 lines (88 loc) · 4.62 KB
/
osu!TouchPad.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include "stdfax.h"
#include "TouchPadDlg.h"
#include <io.h>
#include <fcntl.h>
#include <io.h>
#include <fcntl.h>
#include <fstream>
ISynAPI *pAPI = NULL;
ISynDevice *pDev = NULL;
long Xmin, Xmax, Ymin, Ymax;
class TouchPad : public CWinApp,public _ISynDeviceEvents {
public:
TouchPadDlg *dlg;
int Xsize, Ysize;
double Size, Xoffset, Yoffset;
int width, height;
int left, top;
TouchPad() {
}
virtual BOOL InitInstance();
HRESULT STDMETHODCALLTYPE OnSynDevicePacket(long lSequence);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(TouchPad, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
TouchPad theApp;
BOOL TouchPad::InitInstance() {
// OpenConsole();
AfxEnableControlContainer();
HRESULT hRes = CoInitialize(0);
if (hRes && hRes != S_FALSE)
return false;
long lHandle = -1;
if (CoCreateInstance(_uuidof(SynAPI), 0,
CLSCTX_INPROC_SERVER, _uuidof(ISynAPI), (void **)&pAPI) ||
pAPI->Initialize() ||
pAPI->FindDevice(SE_ConnectionAny, SE_DeviceTouchPad, &lHandle) ||
pAPI->CreateDevice(lHandle, &pDev))
{
return -1;
}
pDev->Acquire(0);
dlg = new TouchPadDlg();
pDev->GetProperty(SP_XLoSensor, &Xmin);
pDev->GetProperty(SP_XHiSensor, &Xmax);
pDev->GetProperty(SP_YLoSensor, &Ymin);
pDev->GetProperty(SP_YHiSensor, &Ymax);
std::ifstream config("config.ini");
config >> Xsize >> Ysize >> Size >> Xoffset >> Yoffset;
width = (Xmax - Xmin) * Size;
height = width * Ysize / Xsize;
int xmid = Xmin * Xoffset + Xmax * (1 - Xoffset);
int ymid = Ymin * Yoffset + Ymax * (1 - Yoffset);
left = xmid - width / 2;
top = ymid - height / 2;
pDev->SetSynchronousNotification(this);
dlg->DoModal();
pDev->Unacquire();
CoUninitialize();
return 0;
}
HRESULT STDMETHODCALLTYPE TouchPad::OnSynDevicePacket(long lSequence) {
SynPacket mp;
pDev->LoadPacket(mp);
static int x = 0, y = 0;
static bool leftDown;
if (mp.ZRaw() > 10) {
x = (mp.XRaw() - left) * Xsize / width;
y = Ysize - (mp.YRaw() - top) * Ysize / height;
}
SetCursorPos(x, y);
long k = mp.ButtonState();
bool ll = (k & SF_ButtonLeft) == SF_ButtonLeft;
if (ll) {
if (!leftDown) {
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
leftDown = true;
}
}
else {
if (leftDown) {
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
leftDown = false;
}
}
return 0;
}