Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
1

Функция WinAPI для получения данных о вращении колёсика мыши

10.08.2018, 11:19. Показов 5083. Ответов 21

Author24 — интернет-сервис помощи студентам
Народ, кто-нибудь знает функцию виндовского апи, которая позволяла бы получить данные о вращении колёсика мыши, не прибегая к сообщениям процедуры окна?

Для получения координат курсора можно использовать функцию GetCursorPos, для нажатия кнопок используем функцию GetKeyState, а для колёсика мыши всё никак не могу найти ничего, ни на MSDN, ни в остальном интернете.
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2018, 11:19
Ответы с готовыми решениями:

Функция для получения данных из закрытого файла
Всем привет, Помогите плиз Есть два документы exel. формула в одном из этих файлов ссылается...

Использование колесика мыши для открытия папок в новом окне?
Добрый день! Давно во всех браузерах функционирует возможность быстро открыть указанную ссылку в...

Функции WinApi для получения системной информации
Кто может помочь в написании программы "Использование функций WinApi для получения системной...

Управление с колёсика мыши
Привет. Есть процедура, которую можно запустить кнопкой. Как эту же процедуру запускать с помощью...

21
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
10.08.2018, 12:25 2
Цитата Сообщение от SunFox25 Посмотреть сообщение
Народ, кто-нибудь знает функцию виндовского апи, которая позволяла бы получить данные о вращении колёсика мыши, не прибегая к сообщениям процедуры окна?

Для получения координат курсора можно использовать функцию GetCursorPos, для нажатия кнопок используем функцию GetKeyState, а для колёсика мыши всё никак не могу найти ничего, ни на MSDN, ни в остальном интернете.
Думаю, такого API быть принципе не может, так как нет фактически объекта, которым управляет колесико. Сообщение WM_MOUSWHEL происходит если колесико мыши было повернуто на определенное количество градусов, но оно не перемещает курсор мыши или не изменяет состояние другого объекта, не требующего какого-нибудь участия программиста, разрабатывающего прикладное приложение.

Конечно, можно создать такой объект, но для этого придется писать для него свой драйвер. Вопрос, а нужен ли такой объект или нет.

Если у вас возник подобный вопрос, то ставьте задачу шире. Хотя бы укажите, для какой цели вам нужны эти данные. Возможно, вам подскажут альтернативные решения задачи. Сейчас для этого нет никакой информации
0
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
10.08.2018, 15:21  [ТС] 3
Спасибо, что ответили.

Мне это нужно для следующей цели. Дело в том, что я создаю собственный класс для мыши. Этот класс при вызове метода Update обновит в своих переменных координаты курсора, состояние кнопок и ситуацию с колёсиком, в результате чего после можно будет при помощи определённых методов и доступа к определённым переменным получить интересующие нас во время процесса игры данные о мыши.

Имейте ввиду, что у меня также есть отдельный класс для окон, и окон в теории может быть несколько одновременно. Поэтому для получения координат курсора относительно левого-верхнего угла окна в метод класса мыши будет передаваться указатель на класс окна.

Работаю в C++ с OpenGL. А вот начинал работать когда-то давно с XNA на C#, так вот там вроде бы класс мыши умел сам как-то получать данные о колёсике мыши, наравне со всем остальным. Да ещё, я конечно не знаю, потому что не работал с этими вещами, но glut и SFML также вроде бы предоставляют данные о колёсике мыши без доступа к процедуре окна.
0
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
10.08.2018, 17:16 4
Цитата Сообщение от SunFox25 Посмотреть сообщение
Спасибо, что ответили.

Мне это нужно для следующей цели. Дело в том, что я создаю собственный класс для мыши. Этот класс при вызове метода Update обновит в своих переменных координаты курсора, состояние кнопок и ситуацию с колёсиком, в результате чего после можно будет при помощи определённых методов и доступа к определённым переменным получить интересующие нас во время процесса игры данные о мыши.
Как я понял, при вращении колесика мышки ваш игровой объект будет совершать некоторые действия. При этом, учтите будет активно окно вашей программы. Так не лучше напрямую задействовать сообщение WM_MOUSEWHEL без всяких там классов.

Я пишу программы на С++ и ассемблере и пришел к выводу, что классы нужны лишь для удобства программиста, за что программа расплачивается снижением своего быстродействия и завышенными минимальными ресурсами, которые покрывают необоснованная мощь современных компьютеров, о возможностях которых мы даже не догадываемся. А некоторые программисты за этим прячут свое неумение писать оптимальный код для решения своих задач
Вы извините меня. Это были мысли в слух
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,661
Записей в блоге: 14
10.08.2018, 17:34 5
SunFox25,
посмотрите
Цитата Сообщение от Melamed Посмотреть сообщение
Я пишу программы на С++ и ассемблере и пришел к выводу, что классы нужны лишь для удобства программиста, за что программа расплачивается снижением своего быстродействия и завышенными минимальными ресурсами, которые покрывают необоснованная мощь современных компьютеров, о возможностях которых мы даже не догадываемся. А некоторые программисты за этим прячут свое неумение писать оптимальный код для решения своих задач
Вы извините меня. Это были мысли в слух
Типичное мнение писателя на ассемблере и вообще любого ярого фаната какой-то идеи. Не зацикливайтесь. Мир многогранен, и с такой точки зрения вы многого не увидите.
0
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
10.08.2018, 18:05 6
Цитата Сообщение от Rius Посмотреть сообщение

Типичное мнение писателя на ассемблере и вообще любого ярого фаната какой-то идеи. Не зацикливайтесь. Мир многогранен, и с такой точки зрения вы многого не увидите.
Я не ярый сторонник ассемблера. Большинство своих программ написал на С++ WinAPI+STL. Иногда, даже пишу классы, где это обосновано. Но, по-моему, сейчас большинство программистов придерживается другой крайности, объектно-ориентированного программирования, что тоже не совсем верно.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,661
Записей в блоге: 14
10.08.2018, 18:22 7
Цитата Сообщение от Melamed Посмотреть сообщение
что тоже не совсем верно.
Низкий уровень: при больших затратах труда даёт приложения малого размера и высокой производительности (если руки прямые).
Высокий уровень: при малых затратах труда получается меньшая производительность с бОльшим размером файлов.

Количество затраченного труда имеет прямое отношение к деньгам и времени.
Производительность тоже влияет. Но в гораздо более узких областях.
Потому сокращение затрат труда чаще всего важнее.
Это не крайность, а следствие развития технологий и конкуренции.
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
10.08.2018, 18:52 8
Можно посмотреть в направлении DirectInput и XInput.
0
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
10.08.2018, 21:45 9
Цитата Сообщение от Rius Посмотреть сообщение
Низкий уровень: при больших затратах труда даёт приложения малого размера и высокой производительности (если руки прямые).
Высокий уровень: при малых затратах труда получается меньшая производительность с бОльшим размером файлов.

Количество затраченного труда имеет прямое отношение к деньгам и времени.
Производительность тоже влияет. Но в гораздо более узких областях.
Потому сокращение затрат труда чаще всего важнее.
Это не крайность, а следствие развития технологий и конкуренции.
И что мы в результате этого имеем. Нам приходится писать программы, которые будут работать на довольно глючной операционной системы MS Windows, так как она установлена у большинства пользователей. Вспомни какой процент операционок этой линейки работало нормально. А все почему? Потому, что программисты работают за деньги. Им лучше лишнюю таблетку написать и получить лишнюю зарплату, чем досконально проверить свой код, но задержать продукт на год. А все ли мы используем возможности последних операционных систем этой линейки. Знаю по себе, нет. Мои программы вполне могли работать на MS Windows Vista, а некоторые даже на ХР. И я не уверен, что производительность моих программ на этих системах была бы ниже, чем на Windows 10.
0
Эксперт .NET
10566 / 6490 / 1506
Регистрация: 25.05.2015
Сообщений: 19,661
Записей в блоге: 14
10.08.2018, 21:52 10
Вот я и говорю: типичный взгляд ассемблерщика, не способного понять другие стороны.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
10.08.2018, 23:57 11
Цитата Сообщение от Melamed Посмотреть сообщение
Иногда, даже пишу классы, где это обосновано.
А шаблонами функций/классов ещё не пользовались? Или задач, связанных с однотипным поведением разных типов данных ещё не было?
Цитата Сообщение от Melamed Посмотреть сообщение
+STL
в плане применения std::vector или всё же шире?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
11.08.2018, 00:54 12
Цитата Сообщение от Melamed Посмотреть сообщение
Как я понял, при вращении колесика мышки ваш игровой объект будет совершать некоторые действия. При этом, учтите будет активно окно вашей программы. Так не лучше напрямую задействовать сообщение WM_MOUSEWHEL без всяких там классов.
Я пишу программы на С++ и ассемблере и пришел к выводу, что классы нужны лишь для удобства программиста, за что программа расплачивается снижением своего быстродействия и завышенными минимальными ресурсами, которые покрывают необоснованная мощь современных компьютеров, о возможностях которых мы даже не догадываемся. А некоторые программисты за этим прячут свое неумение писать оптимальный код для решения своих задач
Вы извините меня. Это были мысли в слух
оптимизация это всё круто конечно, но с чего ты решил, что знаешь ассемблер и приёмы оптимизации на нём лучше, чем профессиональные разработчики компиляторов?
Более того, я просто представить не могу задач, применяющих ООП на С++, которые прям "отжирают ресурсы".
Ну не нравится тебе, что у объекта лишние 4 байта тратятся на таблицу вирт.функций, например? Ну не используй виртуальность... какой-бы ты велосипед ни написал ей на замену, уверен он не будет оптимальнее.
Или какой ужас творит ООП? одна лишняя инструкция push this или mov this при вызове методов инкапсулированных в объект?
Неявный вызов конструкторов и деструкторов? Опять же, там где они не нужны, их нет, там где нужны - попробуй переплюнуть компилятор со своим велосипедом.
Единственный момент связан не с ООП как таковым, а со стандартной библиотекой С++, работа которой медленнее сишны чисто функций.
0
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
11.08.2018, 00:59 13
Отловить действие мышки: прокрутка колесика
0
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
11.08.2018, 14:01  [ТС] 14
Попробовал следующее.

В классе мыши:

C++
1
2
3
4
5
6
7
8
9
10
MSG msg;
PeekMessage(&msg, NULL, WM_MOUSEWHEEL, WM_MOUSEWHEEL, PM_NOREMOVE);
if (msg.message == WM_MOUSEWHEEL)
{
    Wheel = GET_WHEEL_DELTA_WPARAM(msg.wParam);
}
else
{
    Wheel = 0;
}
Работает очень плохо - вращение колёсика срабатывает через несколько раз, или может быть даже через несколько десятков раз, не знаю. Вращаю колёсико, вращаю, а прямоугольник раз в пару-десяток секунд перемещается на установленное количество пикселей и снова замирает.

Есть какие-нибудь светлые идеи по этому поводу? Mouse.Update() при этом пробовал ставить и перед основным PeekMessage (тем который с PM_REMOVE) и после, результат один и тот же. Почему мой мышиный PeekMessage отлавливает сообщение WM_MOUSEWHEEL не всегда? Я думал он не только в сию секунду появившееся сообщение отлавливает, а выполняет поиск по всем накопившимся сообщениям.

А ещё я где-то краем глаза что-то видел про какие-то хуки - якобы для отлова сообщений Windows. Что это такое и для чего нцжно, как использовать не знаю, может это может как-то помочь?

Буду признателен за помощь.
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
12.08.2018, 01:02 15
Простой пример использования трёх вариантов: обычные сообщения, directinput, rawinput (отключен, но можно раскомментировать)
C++
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
#include <windows.h>
#include <windowsx.h>
 
#include <initguid.h>
#include <dinput.h>
#pragma comment(lib, "Dinput8")
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Paint(HWND);
 
int msg_wheel = 0;
int direct_wheel = 0;
 
IDirectInput8* pDirectInput = 0;
IDirectInputDevice8* pDirectInputDevice = 0;
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
    WNDCLASS wc;
    ZeroMemory(&wc, sizeof(wc));
    wc.lpszClassName = TEXT("MyClass");
    wc.hInstance = hInstance;
    wc.lpfnWndProc = WndProc;
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wc);
 
    HWND hWnd = CreateWindow(wc.lpszClassName, TEXT("Mouse wheel info"), WS_OVERLAPPEDWINDOW, 100, 100, 600, 400, 0, 0, hInstance, 0);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    // direct input
    {
        HRESULT hr = CoInitialize(0);
        if (SUCCEEDED(hr))
        {
            hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&pDirectInput, 0);
            if (SUCCEEDED(hr))
            {
                hr = pDirectInput->CreateDevice(GUID_SysMouse, &pDirectInputDevice, 0);
                if (SUCCEEDED(hr))
                {
                    hr = pDirectInputDevice->SetCooperativeLevel(hWnd, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND);
                    if (SUCCEEDED(hr))
                    {
                        hr = pDirectInputDevice->SetDataFormat(&c_dfDIMouse);
                        if (SUCCEEDED(hr))
                        {
                            DIPROPDWORD dipdw;
                            dipdw.diph.dwSize       = sizeof(DIPROPDWORD); 
                            dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER); 
                            dipdw.diph.dwObj        = 0; // device property 
                            dipdw.diph.dwHow        = DIPH_DEVICE;
                            dipdw.dwData            = DIPROPAXISMODE_ABS;
                            hr = pDirectInputDevice->SetProperty(DIPROP_AXISMODE, &dipdw.diph);
                            if (SUCCEEDED(hr))
                            {
                                hr = pDirectInputDevice->Acquire();
                            }
                        }
                    }
                }
            }
        }
 
        if (FAILED(hr))
        {
            if (pDirectInputDevice)
            {
                pDirectInputDevice->Unacquire();
                pDirectInputDevice->Release();
                pDirectInputDevice = 0;
            }
 
            if (pDirectInput)
            {
                pDirectInput->Release();
                pDirectInput = 0;
            }
 
            TCHAR err[256];
            wsprintf(err, TEXT("DirectInput failed: 0x%08X"), hr);
            MessageBox(hWnd, err, TEXT("error"), MB_ICONWARNING);
        }
        else
        {
            SetTimer(hWnd, 1, 10, 0);
        }
    }
 
    //// raw input
    //{
    //    RAWINPUTDEVICE rid;
    //    rid.usUsagePage = 0x01; 
    //    rid.usUsage = 0x02; 
    //    rid.dwFlags = RIDEV_NOLEGACY;   // adds HID mouse and also ignores legacy mouse messages
    //    rid.hwndTarget = 0;
    //    if (!RegisterRawInputDevices(&rid, 1, sizeof(rid)))
    //    {
    //        TCHAR err[256];
    //        wsprintf(err, TEXT("RawInput failed: %d"), GetLastError());
    //        MessageBox(hWnd, err, TEXT("error"), MB_ICONWARNING);
    //    }
    //}
 
    MSG msg;
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    if (pDirectInputDevice)
    {
        pDirectInputDevice->Unacquire();
        pDirectInputDevice->Release();
    }
    if (pDirectInput)
        pDirectInput->Release();
    CoUninitialize();
 
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, WPARAM wParam, LPARAM lParam)
{
    switch (messg)
    {
        case WM_SIZE:
            InvalidateRect(hWnd, 0, TRUE);
            break;
 
        case WM_TIMER:
            if (pDirectInputDevice)
            {
                DIMOUSESTATE state;
                HRESULT hr = pDirectInputDevice->GetDeviceState(sizeof(state), &state);
                if (SUCCEEDED(hr) && (direct_wheel != state.lZ))
                {
                    direct_wheel = state.lZ;
                    InvalidateRect(hWnd, 0, TRUE);
                }
            }
            break;
 
        //case WM_INPUT:
        //    {
        //        TCHAR temp[1024];
        //        UINT dwSize;
        //        GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
        //        LPBYTE lpb = new BYTE[dwSize];
        //        if (lpb == NULL) 
        //            return 0;
        //        if (GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize)
        //            OutputDebugString (TEXT("GetRawInputData does not return correct size !\n")); 
        //        RAWINPUT* raw = (RAWINPUT*)lpb;
        //        if (raw->header.dwType == RIM_TYPEMOUSE) 
        //        {
        //            if (raw->data.mouse.usButtonData != 0)
        //            {
        //                msg_wheel += (short)raw->data.mouse.usButtonData;
        //                InvalidateRect(hWnd, 0, TRUE);
        //            }
        //        } 
        //        delete[] lpb;
        //    }
        //    break;
 
        case WM_MOUSEWHEEL:
            msg_wheel += GET_WHEEL_DELTA_WPARAM(wParam);
            InvalidateRect(hWnd, 0, TRUE);
            break;
 
        case WM_PAINT:
            Paint(hWnd);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, messg, wParam, lParam);
    }
 
    return 0;
}
 
void Paint(HWND hWnd)
{
    RECT rect;
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
 
    static HFONT hFont = CreateFont(20, 0, 0, 0, FW_NORMAL, 0, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, TEXT("Arial"));
    HFONT hOldFont = (HFONT)SelectObject(hdc, hFont);
    
    SetTextColor(hdc, GetSysColor(COLOR_WINDOWTEXT));
    SetBkColor(hdc, GetSysColor(COLOR_WINDOW));
        
    GetClientRect(hWnd, &rect);
 
    TCHAR text[1024];
    wsprintf(text, TEXT("message: %d\ndirect: %d"), msg_wheel, direct_wheel);
    DrawText(hdc, text, -1, &rect, 0);
 
    SelectObject(hdc, hOldFont);
    EndPaint(hWnd, &ps);
}
2
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
12.08.2018, 22:01  [ТС] 16
Спасибо конечно про DirectInput, но я использую OpenGL и мне подключать ещё и DirectX как-то не хочеться.

А как получить данные о колёсике мыши в процедуре окна я и без вас знаю, хватит уже писать. У меня раньше был класс мыши, которому значение вращения колёсика задавать приходилось вручную как раз таки в процедуре окна. Но теперь я сделал отдельный класс для окон, и единственная возможность отлавливать WM_MOUSEWHEEL это передать указатель на класс мыши в какой-нибудь класс окна (процедура окна находиться внутри класса). Но это как-то не профессионально и не удобно.

Есть какие-нибудь идеи почему приведённый мною выше код не работает?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,495
Записей в блоге: 1
12.08.2018, 22:23 17
Лучший ответ Сообщение было отмечено SunFox25 как решение

Решение

Цитата Сообщение от SunFox25 Посмотреть сообщение
А как получить данные о колёсике мыши в процедуре окна я и без вас знаю, хватит уже писать. У меня раньше был класс мыши, которому значение вращения колёсика задавать приходилось вручную как раз таки в процедуре окна. Но теперь я сделал отдельный класс для окон, и единственная возможность отлавливать WM_MOUSEWHEEL это передать указатель на класс мыши в какой-нибудь класс окна (процедура окна находиться внутри класса). Но это как-то не профессионально и не удобно.
С чего бы это? наоборот ООП в чистом виде! При инициализации объект класса регистрируется в WNDproc'е и специально для дёрганья из оттуда создаётся метод setWheel (а впрочем и не только wheel) А уже все пользователи класса переспрашивают эту инфу методом GertWheel
0
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
13.08.2018, 11:25  [ТС] 18
Спасибо, Кузя Домовёнок, разрешили мою проблему моим же решением. Наверное сделаю как и сказал.

Но всё же ради интереса, почему вот этот вот код не работает?


C++
1
2
3
4
5
6
7
8
9
10
11
//В классе мыши
MSG msg;
PeekMessage(&msg, NULL, WM_MOUSEWHEEL, WM_MOUSEWHEEL, PM_NOREMOVE);
if (msg.message == WM_MOUSEWHEEL)
{
    Wheel = GET_WHEEL_DELTA_WPARAM(msg.wParam);
}
else
{
    Wheel = 0;
}
0
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
13.08.2018, 13:13 19
Цитата Сообщение от SunFox25 Посмотреть сообщение
Но всё же ради интереса, почему вот этот вот код не работает?
PeekMessage просматривает только те сообщения, которые лежат в очереди. Если есть ещё один код, который достаёт сообщения из очереди, то, очевидно, что они могут мешать друг другу.
0
0 / 0 / 0
Регистрация: 12.12.2018
Сообщений: 3
18.12.2018, 03:52 20
Ygg, здравствуй, понимаю , что прошло много времени, но я очень тебя прошу помоги.
ты писал код выше, он работает все круто, но как сильно упростить этот код?
мне например не нужно чтобы создавалось окно программы, достаточно обычной консоли.
мне нужно чтобы была переменная которая менялась в зависимости от вращения колеса и все
а дальше я уже сам буду с этой переменной работать
0
18.12.2018, 03:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.12.2018, 03:52
Помогаю со студенческими работами здесь

Событие колесика мыши
Доброй ночи! У меня такая проблема ,не как не могу добиться выполнения кода после события колесика...

Имитация колёсика мыши
Вообщем есть такой код : function mouse_event(dwFlags, dx, dy, dwData, dwExtraInfo: integer):...

Написать программу для получения сведений о системе, используя WinAPI функции
Всем доброго времени суток, в институте такая вот задача далась, помогите её решить пожалуйста: ...

Имитация прокрутки колесика мыши
Здравствуйте! Подскажите пожалуйста, как с имитировать прокрутку колесика мыши?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru