Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
3 / 3 / 1
Регистрация: 03.10.2009
Сообщений: 157

Использование клавиатуры для перемещения курсора

10.10.2014, 16:58. Показов 1461. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
С Win Api начал не давно работать.

Нашел пример кода для управления мыши с помощью клавиатуры.

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
HCURSOR hCurs1, hCurs2; // дескрипторы курсора 
 
POINT pt;               // позиция курсора  
RECT rc;                // координаты рабочей области 
static int repeat = 1;  // счетчик повтора нажатий клавиши
 
// 
// Другие объявления и инициализация. 
// 
 
switch (message) 
{ 
// 
// Обработка других объявлений. 
// 
 
    case WM_KEYDOWN: 
 
        if (wParam != VK_LEFT && wParam != VK_RIGHT && 
        wParam != VK_UP && wParam != VK_DOWN) 
        { 
            break; 
        } 
 
        GetCursorPos(&pt); 
 
        // Преобразование экранных в рабочие координаты. 
 
        ScreenToClient(hwnd, &pt); 
 
        switch (wParam) 
        { 
        // Перемещение курсора, как отражение какая 
        // клавиша со стрелкой нажималась. 
 
            case VK_LEFT:               // стрелка влево
                pt.x -= repeat; 
                break; 
 
            case VK_RIGHT:              // стрелка вправо
                pt.x += repeat; 
                break; 
 
            case VK_UP:                 // стрелка вверх
                pt.y -= repeat; 
                break; 
 
            case VK_DOWN:               // стрелка вниз
                pt.y += repeat; 
                break; 
 
            default: 
                return NULL; 
 
        } 
 
        repeat++;      // Наращивание счетчика повторений. 
 
        // Сохранение курсора в рабочей области. 
 
        GetClientRect(hwnd, &rc); 
 
        if (pt.x >= rc.right) 
        { 
            pt.x = rc.right - 1; 
        } 
        else 
        { 
            if (pt.x < rc.left) 
            { 
                pt.x = rc.left; 
            } 
        } 
 
        if (pt.y >= rc.bottom) 
            pt.y = rc.bottom - 1; 
        else 
            if (pt.y < rc.top) 
                pt.y = rc.top; 
 
        // Преобразование рабочих в экранные координаты. 
 
        ClientToScreen(hwnd, &pt); 
        SetCursorPos(pt.x, pt.y); 
        break; 
 
    case WM_KEYUP: 
 
        repeat = 1;      // Очистка счетчика повторений. 
        break; 
 
}
При компиляции ошибки.
[C++ Error] Unit1.cpp(26): E2451 Undefined symbol 'message'
[C++ Error] Unit1.cpp(34): E2451 Undefined symbol 'wParam'
[C++ Error] Unit1.cpp(44): E2451 Undefined symbol 'hwnd'
[C++ Error] Unit1.cpp(44): E2227 Extra parameter in call to _fastcall TControl::ScreenToClient(const TPoint &)
[C++ Error] Unit1.cpp(76): E2227 Extra parameter in call to _fastcall TCustomForm::GetClientRect()
[C++ Error] Unit1.cpp(98): E2227 Extra parameter in call to _fastcall TControl::ClientToScreen(const TPoint &)
Что такое message,wParam,hwnd ? Как их объявить?
P.S Можно какую-нибудь литературу про них, для чего они и примерчик.
Буду очень благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2014, 16:58
Ответы с готовыми решениями:

Отслеживание перемещения курсора
Есть окно, в нём при перемещении курсора на каждые 100 пикселей нужно выводить рандомный символ. Как отследить координаты курсора?

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

EditText, кнопки вместо клавиатуры, использование курсора, вызов клавиатуры "вручную"
Ну, в общем, я постарался написать наиболее подходящее название темы. Перекопал весь киберфорум, и ещё кучу сайтов в гугле, но нифига не...

4
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,145
Записей в блоге: 3
10.10.2014, 17:22
я бы наверное просто двигал бы курсор мыши по hotKey стрелок клавиатуры
0
3 / 3 / 1
Регистрация: 03.10.2009
Сообщений: 157
10.10.2014, 17:41  [ТС]
Dinkin, Мне надо реализовать с помощью api библиотек.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33376 / 21500 / 8236
Регистрация: 22.10.2011
Сообщений: 36,896
Записей в блоге: 11
10.10.2014, 17:55
Тогда показывай код полностью, а не этот огрызок, потому что совершенно непонятно, откуда это все вызывается.
0
3 / 3 / 1
Регистрация: 03.10.2009
Сообщений: 157
10.10.2014, 20:08  [ТС]
UI, Больше ничего и нет. Я делаю это при активной форме.
Или может подскажете как можно по другому сделать?

Добавлено через 1 час 10 минут
Ну вот создал форму. Прописал в событие FormKeyPress.
Почему ничего не происходит, когда я нажимаю стрелки?В wParam ведь должно передаться, что я нажал стрелку.

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HCURSOR hCurs1, hCurs2; // дескрипторы курсора
HWND hwnd;
UINT message;
WPARAM wParam;
POINT*pt = new POINT;;               // позиция курсора
RECT*rc = new RECT;                // координаты рабочей области
static int repeat = 1;  // счетчик повтора нажатий клавиши
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
 
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
switch (message)    //С
        {
//
// Обработка других объявлений.
//
 
    case WM_KEYDOWN:
 
        if (wParam != VK_LEFT && wParam != VK_RIGHT &&
        wParam != VK_UP && wParam != VK_DOWN)
        {
            break;
        }
 
        GetCursorPos(pt);
 
        // Преобразование экранных в рабочие координаты.
 
        ::ScreenToClient(Form1->Handle, pt);
 
        switch (wParam)
        {
        // Перемещение курсора, как отражение какая
        // клавиша со стрелкой нажималась.
 
            case VK_LEFT:               // стрелка влево
                pt->x -= repeat;
                break;
 
            case VK_RIGHT:              // стрелка вправо
                pt->x += repeat;
                break;
 
            case VK_UP:                 // стрелка вверх
                pt->y -= repeat;
                break; 
 
            case VK_DOWN:               // стрелка вниз
                pt->y += repeat;
                break;
 
        //   default:
               // return 0;
 
        }
 
        repeat++;      // Наращивание счетчика повторений.
 
        // Сохранение курсора в рабочей области.
 
        ::GetClientRect(hwnd, rc);
 
        if (pt->x >= rc->right)
        {
            pt->x = rc->right - 1;
        }
        else
        {
            if (pt->x < rc->left)
            {
                pt->x = rc->left;
            }
        }
 
        if (pt->y >= rc->bottom)
            pt->y = rc->bottom - 1;
        else
            if (pt->y < rc->top)
                pt->y = rc->top;
 
        // Преобразование рабочих в экранные координаты.
 
        ::ClientToScreen(Form1->Handle, pt);
        SetCursorPos(pt->x, pt->y);
        break;
 
    case WM_KEYUP:
 
       repeat = 1;      // Очистка счетчика повторений.
      break;
 
        }        
}
//---------------------------------------------------------------------------
Добавлено через 43 минуты
Тема не актуальна. Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.10.2014, 20:08
Помогаю со студенческими работами здесь

Тип курсора для перемещения по рекордсету в разные стороны?
я использую коннект типа: Set Conn = Server.CreateObject('ADODB.Connection') Conn.Open 'Provider=SQLOLEDB.1;Password=albert;Persist...

Перемещения курсора мыши
Доброго времени суток! Возможно ли реализовать перемещения курсора мыши по заданным координатам?

Перемещения курсора мыши
Здравствуйте. Подскажите пожалуйста. Кто знает какие способы для перемещения курсора мыши? Если можно то в в двух словах о каждом.

Запрет перемещения курсора
Как запретить перемещение между Edit-ами с помощью клавиши TAB?

Мониторинг перемещения курсора по x y
Какая программа есть для отслеживания перемещения курсора по x y ?


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru