3 / 3 / 1
Регистрация: 03.10.2009
Сообщений: 157

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

10.10.2014, 16:58. Показов 1464. Ответов 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,150
Записей в блоге: 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
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru