-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhh3.cpp
More file actions
235 lines (235 loc) · 10.7 KB
/
hh3.cpp
File metadata and controls
235 lines (235 loc) · 10.7 KB
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#include <Windows.h>
#include "hh3.h"
#include "MVector.h"
#include "MHKeypad.h"
#include "Settings.h"
#ifdef _DEBUG
#include <stdio.h>
#include <math.h>
TCHAR debug_buf_3[4096];
#endif
bool IsOpposite(int old_direction, int new_direction); // Определена в hh1.cpp
extern LONG screen_x, screen_y;
extern HWND MHhwnd;
static int offset=0, last_any_position=-1,
serial_fasts=0, oast_allowed=0, b2st_allowed=0;
static DWORD last_any_time=0, // Время последнего пперемещения мыши
last_fast_time=0,
last_bast_time=0;
void MHookHandler3::OnTimer()
{
if(-1==position_mem) {
KillTimer(MHhwnd,1);
return;
} // Клавиша не нажата, делать нечего
// Проверяем, а не рудимент ли это, оставшийся в очереди сообщений?
// Для этого проверим, действительнор ли истекло нужное время
DWORD time_now=timeGetTime();
if(time_now-last_time<MHSettings::timeout_after_move) return;
// Действительно, время отпустить клавишу!
KillTimer(MHhwnd,1);
MHKeypad::Press(position_mem,false,offset);
MHVector::Reset(); // Вот это обязательно, иначе в том же направлении мышь не нажмёт клавишу
// Почему-то Reset не включает перерисовку
InvalidateRect(MHhwnd,NULL,TRUE);
position_mem=-1;
}
int MHookHandler3::OnMouseMove(LONG _x, LONG _y)
{
int position = 0;
DWORD time_now=timeGetTime();
float Qspeed = 0.0f;
int IsOp = 0;
// При нажатой правой кнопке мыши не передаём её движения в MHVector,
// НО! продолжаем отслеживать last_x и last_y, не сбрасывая initialized!
//if((initialized)&&(!rbutton_pressed)) // известно последнее положение мыши, правая кнопка не нажата
if(initialized) // известно последнее положение мыши, правая кнопка теперь тоже генерирует клавиши
{
dx=(_x-last_x);
dy=(_y-last_y);
// Может, пятую кнопку можно нажать?
if(MHSettings::flag_enable_speed_button) OnFastMove(dx,dy);
// Чтобы не запутаться - здесь кусок без контроля скорости
if(!MHSettings::flag_skip_fast)
{
position=MHVector::NewValues(dx,dy);
if(0<=position) // -2=мышь подвинулась на недостаточное растояние, -1= направление не изменилось
{
MHKeypad::Press(position,true,offset);
position_mem=position;
}
// Таймер взводим заново при любом движении мыши, если было хоть что-то нажато ранее
// то есть -1!=position_mem
if(-1!=position_mem)
{
last_time=time_now;
SetTimer(MHhwnd,1,MHSettings::timeout_after_move,NULL);
}
}
else // а вот здесь нажимаем не всегда
{
// для начала вычислим скорость
Qspeed=100.0f*(dx*dx+dy*dy)/(time_now-last_any_time); // пикселов в квадрате за 100 мс
if(Qspeed>MHSettings::minimal_mouse_speed) // Это элемент быстрого движения!!!
{
serial_fasts++;
if(serial_fasts>2) oast_allowed=3; else oast_allowed=0; // Мы достаточно набрали fast, чтобы игнорировать хвост
// Безусловно ничего не жмём, запоминаем время
last_fast_time=time_now;
#ifdef _DEBUG
swprintf(debug_buf_3,_countof(debug_buf_3),L"FAST dx: %d dy: %d Qspeed: %f time: %lu\n", dx,dy,Qspeed, time_now-last_any_time);
OutputDebugString(debug_buf_3);
#endif
}
else // Скорость низкая, проверяем дополнительно
{
serial_fasts=0; // Последовательность FAST-движений прервана.
// 2.1. Может, это хвост быстрого движения (OAST)?
// Чиста нулевой OAST - это BAST !!!!
//if((time_now-last_fast_time<80)&&((dx!=0)||(dy!=0)))
if((time_now-last_fast_time<80)&&(oast_allowed))
{
oast_allowed--;
#ifdef _DEBUG
swprintf(debug_buf_3,_countof(debug_buf_3),L"OAST dx: %d dy: %d Qspeed: %f time: %lu ftime: %lu\n", dx,dy,Qspeed, time_now-last_any_time, time_now-last_fast_time);
OutputDebugString(debug_buf_3);
#endif
}
// 2.2 а,б - начало, запоминаем его время
//else if(((Qspeed<2.0f)&&(time_now-last_any_time>30))||((0==dx)&&(0==dy)))
else if((Qspeed<2.0f)&&(time_now-last_any_time>30))
{
last_bast_time=time_now;
b2st_allowed=2;
#ifdef _DEBUG
swprintf(debug_buf_3,_countof(debug_buf_3),L"BAST dx: %d dy: %d Qspeed: %f time: %lu ftime: %lu\n", dx,dy,Qspeed, time_now-last_any_time, time_now-last_fast_time);
OutputDebugString(debug_buf_3);
#endif
}
// 2.2. в: возможно, разгоняемся
else if((time_now-last_bast_time<50)&&(b2st_allowed))
{
b2st_allowed--;
#ifdef _DEBUG
swprintf(debug_buf_3,_countof(debug_buf_3),L"B2ST dx: %d dy: %d Qspeed: %f time: %lu ftime: %lu\n", dx,dy,Qspeed, time_now-last_any_time, time_now-last_fast_time);
OutputDebugString(debug_buf_3);
#endif
}
else // Всё-таки настояли на SLOW! (теперь сюда попадают и dx==0, dy==0)
{
// Всё-таки обрабатываем движение (копипаст из начала)
position=MHVector::NewValues(dx,dy);
IsOp=IsOpposite(last_any_position, position);
if(position>=0) last_any_position=position;
if(IsOp) // Поменяли направление - нужно считать этот отсчёт - BAST (B-ST в диагностике)
{
last_bast_time=time_now;
b2st_allowed=2;
MHVector::Reset(); // Вот это обязательно, иначе в том же направлении мышь не нажмёт клавишу
InvalidateRect(MHhwnd,NULL,TRUE); // Правильные квадратики
#ifdef _DEBUG
swprintf(debug_buf_3,_countof(debug_buf_3),L"OPPO dx: %d dy: %d Qspeed: %f time: %lu ftime: %lu\n", dx,dy,Qspeed, time_now-last_any_time, time_now-last_fast_time);
OutputDebugString(debug_buf_3);
#endif
}
else
{
// Только сейчас считаем себя SLOW
if(0<=position) // -2=мышь подвинулась на недостаточное растояние, -1= направление не изменилось
{
MHKeypad::Press(position,true,offset);
position_mem=position;
}
// Таймер взводим заново при любом движении мыши, если было хоть что-то нажато ранее
// то есть -1!=position_mem
if(-1!=position_mem)
{
last_time=time_now;
SetTimer(MHhwnd,1,MHSettings::timeout_after_move,NULL);
}
#ifdef _DEBUG
swprintf(debug_buf_3,_countof(debug_buf_3),L"SLOW dx: %d dy: %d Qspeed: %f time: %lu ftime: %lu pos: %d IsOp: %d\n", dx,dy,Qspeed, time_now-last_any_time, time_now-last_fast_time, position, IsOp);
OutputDebugString(debug_buf_3);
#endif
}
} // обрабатываем движение
} // низкая скорость
}
/*
// Теперь берём цифры из поля "быстрое движение - это со скоростью, большей..."
// Цифры не настоящие, мы меряем не скорость, а один отсчёт, не глядя на время.
// Но позволяет регулировать на уровне больше-меньше....
//if((!MHSettings::flag_skip_fast)||(dx*dx+dy*dy<30))
if((!MHSettings::flag_skip_fast)||(dx*dx+dy*dy<MHSettings::minimal_mouse_speed/54))
{
#ifdef _DEBUG
// swprintf(debug_buf_3,_countof(debug_buf_3),L"SLOW: dx: %d dy: %d time: %ul\n", dx,dy,time_now-last_fast_time);
// OutputDebugString(debug_buf_3);
#endif
// нажатие разрешено при flag_skip_test только, если успокоились после быстрого движения
//if((!MHSettings::flag_skip_fast)||(time_now-last_fast_time>1000))
{
position=MHVector::NewValues(dx,dy);
#ifdef _DEBUG
//swprintf(debug_buf_3,_countof(debug_buf_3),L"SLOW dx: %d dy: %d Qspeed: %f time: %lu pos: %d\n", dx,dy,sqrt((float)(dx*dx+dy*dy))/(time_now-last_any_time), time_now-last_fast_time, position);
//swprintf(debug_buf_3,_countof(debug_buf_3),L"SLOW dx: %d dy: %d Qspeed: %f time: %lu pos: %d\n", dx,dy,5625.0*(dx*dx+dy*dy)/(time_now-last_any_time)/(time_now-last_any_time), time_now-last_fast_time, position);
swprintf(debug_buf_3,_countof(debug_buf_3),L"SLOW dx: %d dy: %d Qspeed: %f time: %lu ftime: %lu pos: %d\n", dx,dy,100.0f*(dx*dx+dy*dy)/(time_now-last_any_time), time_now-last_any_time, time_now-last_fast_time, position);
OutputDebugString(debug_buf_3);
#endif
if(0<=position) // -2=мышь подвинулась на недостаточное растояние, -1= направление не изменилось
{
MHKeypad::Press(position,true,offset);
position_mem=position;
}
// Таймер взводим заново при любом движении мыши, если было хоть что-то нажато ранее
// то есть -1!=position_mem
if(-1!=position_mem)
{
last_time=time_now;
SetTimer(MHhwnd,1,MHSettings::timeout_after_move,NULL);
}
} // нажатие разрешено
}
else // быстрое движение и флаг быстрого движения выставлен
{
last_fast_time=time_now;
}
*/
last_any_time=time_now;
}
if(!initialized) initialized=true;
last_x=_x;
last_y=_y;
if(last_x<0) last_x=0;
if(last_y<0) last_y=0;
if(last_x>=screen_x) last_x=screen_x-1;
if(last_y>=screen_y) last_y=screen_y-1;
return 0; // Новая директива ВЦСПС
}
bool MHookHandler3::OnRDown()
{
KillTimer(MHhwnd,1);
rbutton_pressed=true;
MHKeypad::Reset(offset); // Отпускаем нажатые кнопки
MHVector::Reset();
position_mem=-1;
offset=6;
return true; // подавляйте правый клик
}
bool MHookHandler3::OnRUp()
{
KillTimer(MHhwnd,1);
rbutton_pressed=false;
MHKeypad::Reset(offset); // Отпускаем нажатые кнопки
// Начинаем новый отсчет движений
MHVector::Reset();
position_mem=-1;
offset=0;
return true; // подавляйте правый клик
}
void MHookHandler3::Halt()
{
// отожмём клавиши
MHKeypad::Reset(offset);
offset=0;
}