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

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

10.10.2014, 16:58. Показов 1473. Ответов 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,154
Записей в блоге: 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
33403 / 21513 / 8236
Регистрация: 22.10.2011
Сообщений: 36,914
Записей в блоге: 12
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
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru