Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для Наталья8
621 / 379 / 67
Регистрация: 09.03.2016
Сообщений: 4,074

Хук на клавиши, хорошо ли это? (Культура програмирования). И за одно, почему опрос клавишь тормозит

29.03.2023, 16:07. Показов 1699. Ответов 2

Студворк — интернет-сервис помощи студентам
Я написал вот такой шедевр.
Это типа задержка на отсчёт.
и за одно опрашивает (опрашивало) клавиши, Корректировать коорд. рамки..

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
//--------------- Макрос
#define KEYDOWN(vk_code)\
          ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
          #define KEYUP(vk_code) \
          ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
//....................................
//....................................
 
short delay(0);
while (++delay < 400)// Это задержка, в которой все кнопки (по next_step задержки нет)
{// ===============  Подстройка координат рамки и задержка за одно  =============
    if (control::next_step)break;// <---- КНОПКА NEXT НАЖАТА задержку перескакивает.
    if (KEYDOWN(VK_UP) || KEYDOWN(VK_DOWN) ||
        KEYDOWN(VK_LEFT) || KEYDOWN(VK_RIGHT) ||
        KEYDOWN('W') || KEYDOWN('S') ||
        KEYDOWN('A') || KEYDOWN('D')){
        if (KEYDOWN(VK_UP) || KEYDOWN('W'))iy--;
        if (KEYDOWN(VK_DOWN) || KEYDOWN('S'))iy++;
        if (KEYDOWN(VK_LEFT) || KEYDOWN('A'))ix--;
        if (KEYDOWN(VK_RIGHT) || KEYDOWN('D'))ix++;
        MoveWindow(hWnd_win, ix - 3, iy - 3, Win_x + 8, Win_y + 8, false);// (Так же, как выше. примерно строка 1447)
        while (KEYDOWN(VK_UP) || KEYDOWN(VK_DOWN) || KEYDOWN(VK_LEFT) || KEYDOWN(VK_RIGHT) ||
            KEYDOWN('W') || KEYDOWN('S') || KEYDOWN('A') || KEYDOWN('D'))Sleep(10);
    } Sleep(2);
    if (KEYDOWN(VK_F2) && KEYDOWN(VK_F4)){ // --- Перезапуск приложения ( F2 + F4 )
        //При выключении программы освобождаем мютекс, если он был у нас захвачен и удаляем его (Запрет запуска второй копии )
        ReleaseMutex(mutex); CloseHandle(mutex);
        ShellExecute(NULL, L"open", restart, NULL, NULL, SW_SHOWDEFAULT);
        return 0;
    } }
Полгодика поработало. Потом эта задержка стала периодически изменяться до психа...
С чего это она? Может кейлоггер кто мне поставил?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2023, 16:07
Ответы с готовыми решениями:

Почему from . import , это не очень хорошо?
Я не могу понять , почему в книге укус питона написано , что &quot;В общем случае вам следует избегать использования этого оператора и...

Хук не понимает некоторые клавиши
Ребята, кому не трудно помогите пожалуйста, проблема в следующем. Есть класс хука UserActivityHook думаю многие его знают, так вот нашел...

глобальный хук на одно приложение
никогда не любил работать с апи, но надо ... помогите, нужно повесить хук на нажатие клавиши (допустим ф3), причем чтобы этот хук...

2
 Аватар для Наталья8
621 / 379 / 67
Регистрация: 09.03.2016
Сообщений: 4,074
29.03.2023, 16:11  [ТС]
0
 Аватар для Наталья8
621 / 379 / 67
Регистрация: 09.03.2016
Сообщений: 4,074
29.03.2023, 16:19  [ТС]
Наковырял/ накомпилировал в интернете вот такое. Хорошо ли это?

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
//================= Хук на клавиши (Двигать рамку)
//=============================================================
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    BOOL fEatKeystroke = FALSE;
    if (nCode == HC_ACTION)
    {
    switch (wParam) {
        case WM_KEYDOWN:
        {   PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
        if (fEatKeystroke = (p->vkCode == 'W'))
        {   Beep(4000, 10); frame_set.top--;
        }
        else  if (fEatKeystroke = (p->vkCode == 'S'))
        {   Beep(3500, 10); frame_set.top++;
        }
        else if (fEatKeystroke = (p->vkCode == 'A'))
        {   Beep(3000, 10); frame_set.left--;
        }
        else if (fEatKeystroke = (p->vkCode == 'D'))
        {   Beep(2500, 10); frame_set.left++;
        }
                       break;
        }   }   }
 
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}
 
 
 
 
//=========================================================
HINSTANCE hinstExe = GetModuleHandle(NULL);// Поставить хук
     hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
 
 
UnhookWindowsHookEx(hHook); //<<----- Снять захват
Работает вроде. Может кому интересно будет.

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
short delay(0);
while (++delay < 80)// Это задержка, в которой все кнопки (по next_step задержки нет)
{// ===============  Подстройка координат рамки и задержка за одно  =============
    if (control::next_step)break;// <---- КНОПКА NEXT НАЖАТА задержку перескакивает.
    
    cvWaitKey(10);// frame_set.top - X; frame_set.left -y;
 
MoveWindow(hWnd_win, (ix + frame_set.left) - 3, (iy + frame_set.top) - 3, Win_x + 8, Win_y + 8, false);// (Так же, как выше. примерно строка 1447)
 
    if (KEYDOWN(VK_F2) && KEYDOWN(VK_F4)){ // --- Перезапуск приложения ( F2 + F4 )
        //При выключении программы освобождаем мютекс, если он был у нас захвачен и удаляем его (Запрет запуска второй копии )
        ReleaseMutex(mutex); CloseHandle(mutex);
        ShellExecute(NULL, L"open", restart, NULL, NULL, SW_SHOWDEFAULT);
        return 0;
    } }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.03.2023, 16:19
Помогаю со студенческими работами здесь

Как заставить хук ловить 2 клавиши?
Есть глобальный хук using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Поставить хук и предотвратимть нажатие клавиши
Первый вопрос: как с помощью хука отменить действие нажатой клавиши?Например пользователь нажимает клавишу F6,мой хук перехватывает ее и...

Блокировка клавиши, используя глобальный хук
Была создана программа перехвата нажатия кнопок клавиатуры. Теперь встает вопрос: А можно ли как нибудь средствами С# заблокировать...

Хук блокирует клавиши в другом приложении
Скачал готовую прогу(исходник с codeproject). Нормально перехватывает клавиши. Но в результате та прога(онлайн игра во флеше) которую и...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru