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


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

Демонстрационный пример

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; 
 
} 

 

Назад в оглавление
На главную страницу

Hosted by uCoz