Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2014, 07:06   #1
shanluu
Пользователь
 
Аватар для shanluu
 
Регистрация: 05.10.2010
Сообщений: 53
По умолчанию Двойная обработка.

Здравствуйте. Была необходимость сделать глобальный хук.

Нашел данный код, который работает отлично, но по нажатию клавиши выводит текст 2 раза в консоль.

Код:
#include <windows.h>
#include <iostream>
 
LRESULT CALLBACK LLKeyProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode == HC_ACTION)
    {
        DWORD vk = ((LPKBDLLHOOKSTRUCT)lParam)->vkCode;
        std::cout << "key pressed : " << vk << std::endl;
        if(vk == 0x1b)
        {
            PostQuitMessage(0);
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
 
int main()
{
    HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyProc, GetModuleHandle(NULL), 0);
    if(hook)
    {
        while(WaitMessage())
        {
            MSG msg = {0};
            while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
            {
                if(msg.message == WM_QUIT)
                {
                    UnhookWindowsHookEx(hook);
                    return 0;
                }
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }
    return 0;
}
Прошу помощи. В чем проблема в коде?

Последний раз редактировалось Stilet; 17.03.2014 в 09:00.
shanluu вне форума Ответить с цитированием
Старый 17.03.2014, 09:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Хук ловит нажатие и отпускание клавиши - отсюда две записи.
Кажется нужно анализировать в lParam 30-й бит. Если он 1 - клавиша была отпущена.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.03.2014, 15:21   #3
shanluu
Пользователь
 
Аватар для shanluu
 
Регистрация: 05.10.2010
Сообщений: 53
По умолчанию

Stilet - большое спасибо. Дал направление в какую сторону курить.

После небольшого курения понял
lParam - у нас указатель на структуру KBDLLHOOKSTRUCT.
а wParam - идентификатор сообщений. как-то так Вот он и нужен был.

Все решилось изменением

Цитата:
if(nCode == HC_ACTION)
на
Цитата:
if ((nCode == HC_ACTION) && (wParam == WM_KEYUP))
shanluu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двойная формула ЕСЛИ Deathcube Microsoft Office Excel 1 11.08.2013 21:29
Двойная группировка tiktak C/C++ Базы данных 0 20.05.2012 19:56
Двойная буферизация в dotNet DimaTs Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 13.12.2011 22:26
Двойная авторизация Ribun Microsoft Office Access 2 15.07.2011 12:53
Двойная буферизация volod3000 Общие вопросы Delphi 4 27.03.2009 00:08