Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744

Делаем скользящий курсор!

17.10.2011, 16:39. Показов 3241. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Увидел у знакомого супер-мышь (механический манипулятор, а не то что вы подумали), к которой прилагается интересная утилита.
Суть ее заключается в следующем:

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

Суть нашей программы:
1) Низкоуровневый хук на мышь
2) Сохраняем координаты курсора
3) При последующем их изменении продолжаем двигать курсор в направлении вектора

И так:
1) Как получить этот вектор в С++ по 2-м точкам? (Алгебраическую формулу прикрепил)
2) Как реализовать движение с определенной скоростью (мб в цикле, или Sleep() ?)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HHOOK hHook;
MOUSEHOOKSTRUCT* psMouseHook;
TPoint lp;   // Координаты последнего положения курсора
 
LRESULT CALLBACK LLMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HC_ACTION) {
        if(wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE)
        {
            // Тут считаем вектор и двигаем курсор
            // Сохранили координаты
            lp.x = psMouseHook->pt.x;
            lp.y = psMouseHook->pt.y;
        }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}
Изображения
 
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.10.2011, 16:39
Ответы с готовыми решениями:

Делаем игру. Можете помочь?
Знаю, что ваще не по теме, но нормальных программистов, кроме как на специальных форумах, как этот, мы найти нигде не можем. Короче, нужны...

Как сделать, что бы в Memo1, на месте (строке) где стоит курсор, выделялась цветом строчка, где стоит печатный курсор «|»?
Как сделать, что бы в Memo1, на месте (строке) где стоит курсор, выделялась цветом строчка, где стоит печатный курсор «|»?

Скользящий режим
Короче установил новую винду ,и заметил что в любых программах и папках перелистывание идет как то по другому , оно как будто скользит как...

9
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
17.10.2011, 16:57  [ТС]
3) Можно ли сделать так, чтоб не тормозил курсор? Тот код, что я выложил затормаживает!
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
17.10.2011, 17:21
SetCursorPos() и GetCursorPos()
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
19.10.2011, 00:00  [ТС]
Нужно что-то хитрое..
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
19.10.2011, 00:09
Я сомневаюсь в том что могу быть полезен в этом предприятии, однако один вопрос всетаки задам.
А как наводить курсор на кнопку, если он по инерции будет дальше двигаться?
Находу кликать можно, только долго попадать.
Чтото похожее я видел в старой компьютерной игре там немного тоже проскакивал курсор, но там кнопки были громадные...
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
19.10.2011, 00:12  [ТС]
Цитата Сообщение от Samrisbe Посмотреть сообщение
Я сомневаюсь в том что могу быть полезен в этом предприятии, однако один вопрос всетаки задам.
А как наводить курсор на кнопку, если он по инерции будет дальше двигаться?
Находу кликать можно, только долго попадать.
Чтото похожее я видел в старой компьютерной игре там немного тоже проскакивал курсор, но там кнопки были громадные...
Дальность скольжения курсора будет определяться скоростью толчка мыши)
Будем задавать коэффициент зависимости дальностьи от толчка
Думаю, при движении мыши со средней скоростью скользить он должен не более 100px
0
Прогер
 Аватар для Programmer.
632 / 263 / 15
Регистрация: 17.11.2010
Сообщений: 1,371
Записей в блоге: 2
19.10.2011, 02:44
__bool,
без
Цитата Сообщение от LK Посмотреть сообщение
SetCursorPos() и GetCursorPos()
хитрость не получитя я думаю...
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
19.10.2011, 09:40  [ТС]
Цитата Сообщение от Programmer. Посмотреть сообщение
__bool,
без SetCursorPos() и GetCursorPos()
хитрость не получитя я думаю...
Это да, специально для таких манипуляций они и созданы, что я уже с ними только не делал....
0
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
19.10.2011, 18:27
Цитата Сообщение от __bool Посмотреть сообщение
....... что я уже с ними только не делал....

Не по теме:

Code
1
и того не делал, и этого не делал, и еще много чего не делал...

0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
19.10.2011, 20:16  [ТС]
Получается так, что очередное выполнение LRESULT CALLBACK LLMouseProc(..)
происходит раньше, чем функция закончит свое выполнение вот тут наглядно:
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
LRESULT CALLBACK LLMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
#define X psMouseHook->pt.x
#define Y psMouseHook->pt.y
    if(wParam==WM_MOUSEMOVE || wParam==WM_NCMOUSEMOVE)
    {
        return 1; // Первый (выполняется всегда)
        double Diff = (double)GetTickCount() - last;
        MainForm->Label2->Caption = FloatToStr(Diff);
        last = (double)GetTickCount();
 
        if (Diff > 30) {
            return 1;      // Второй (выполняется через раз(примерно))
            for(int i=0; i < 100; ++i) {
                MainForm->Label1->Caption = "Moving " + IntToStr(i); 
                                // Выходит только "Moving 0"
                SetCursorPos(X - (lp.x-X+5), Y-(lp.y-Y+5));
                return 1;  // Третий
            }
            MainForm->Label1->Caption = ++count;
        }
        lp.x = X; // Сохраняем координаты, чтоб в следующий раз двигать курсор относительно них
        lp.y = Y;
        return 1; (вообще не выполняется)
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
}
Зная что return 1; прервет хук и даже Windows не получит сообщение - решил поэкспериментировать
Первый return 1; не дает курсору двигаться, что очевидно
Второй дает двигаться через раз! (Длина движения курсора в 2 раза меньше обычного)
Третий вообще не выполняется!
(Разумеется я коментирую все return, кроме того, что проверяю)

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

Нет слов..
(Надеюсь что у вас они найдутся)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2011, 20:16
Помогаю со студенческими работами здесь

Скользящий интерполяционный многочлен
Используя &quot;скользящий &quot; интерполяционный многочлен, изучить влияние степени многочлена на ошибку интерполирования в зависимости от степени...

Скользящий и вращающийся стержень
Стержень лежит на гладкой поверхности стола. Длина 1м, масса 1кг, следовательно его момент инерции 1/12 кг*м^2. Перпендикулярно оси стержня...

Сила-скользящий вектор. Соответсвенно любые не паралельные три,четыре,пять....n сил можно считать сходящимися?
Добрый день! Подскажите,пожалуйста,с освоением азов статики теормеха! В разделе статика есть глава о системе сходящихся сил на...

Не работает Num Lock, курсор на нем, сам курсор неактивен
Помогите решить проблему, с ней не справляется наш программист (для раб.ПК). Не знаю, что делать и сидит сложа руки:sleep:. А я работаю с...

В форме при активации курсор посредине, убрал курсор с формы она должна закрыться
Здравствуйте, чем вспоминать дни прошедшие..., есть форма, (она из Ворда), по задумке - она открылась надо чтобы курсор был посредине формы...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru