티스토리 뷰

보안

KeyDown, KeyPress, KeyUp

NineKY 2008. 1. 17. 20:46

на первую страницу
Логин  
Пароль  
 | Регистрация  | Забыли?

на первую страницу  Форумы  Общий форум


Общий форум
 


Нить: KeyDown, KeyPress, KeyUp Сообщить модератору
DmitriAl 

 

Добрый день!
Подскажите, как решить проблему: я ловлю нажатия клавиш следующим образом

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0) {
        switch (state) {
            case 0:
                if (wParam == VK_CONTROL)

Нажатие на одну клавишу создает три сообщения: KeyDown, KeyPress, KeyUp. Я хочу обрабатывать только KeyDown. В MSDN написано, что если 31 бит lParam равен нулю, то клавиша нажата, иначе клавиша отжата. Я пишу

if ((wParam == VK_CONTROL) && !(lParam & 80000000))

Но это условие выполняется уже два раза, а не три при нажатии на одну клавишу. Как сделать, чтобы оно выполнялось один раз?

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 19.10.2005 22:55

Ответить на сообщение Ответить с цитированием

Re: KeyDown, KeyPress, KeyUp Сообщить модератору
eddy_ka 

 

Здравствуйте, DmitriAl, Вы писали:

DA>Подскажите, как решить проблему: я ловлю нажатия клавиш следующим образом


DA>

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
DA>{
DA>    if (nCode >= 0) {
DA>        switch (state) {
DA>            case 0:
DA>                if (wParam == VK_CONTROL)
DA>


DA>Нажатие на одну клавишу создает три сообщения: KeyDown, KeyPress, KeyUp. Я хочу обрабатывать только KeyDown. В MSDN написано, что если 31 бит lParam равен нулю, то клавиша нажата, иначе клавиша отжата. Я пишу


DA>

DA>if ((wParam == VK_CONTROL) && !(lParam & 80000000))
DA>


DA>Но это условие выполняется уже два раза, а не три при нажатии на одну клавишу. Как сделать, чтобы оно выполнялось один раз?

Странно, на сколько я помню HookProc должен иметь еще один параметр — сообщение (msg)...
Тогда, вообще, все получается просто:

switch(msg)
{
   case WM_KEYDOWN :
      <...>
   break;
}

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 20.10.05 02:20

Ответить на сообщение Ответить с цитированием

Re[2]: KeyDown, KeyPress, KeyUp Сообщить модератору
DmitriAl 

 

Здравствуйте, eddy_ka, Вы писали:

_>Странно, на сколько я помню HookProc должен иметь еще один параметр — сообщение (msg)...

MSDN:


LRESULT CALLBACK KeyboardProc(          int code,
    WPARAM wParam,
    LPARAM lParam
);

Please help! Что делать?

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 20.10.05 12:03

Ответить на сообщение Ответить с цитированием

Re: KeyDown, KeyPress, KeyUp Сообщить модератору
VladKurmaz 

 

Здравствуйте, DmitriAl, Вы писали:

DA>Добрый день!


DA>Подскажите, как решить проблему: я ловлю нажатия клавиш следующим образом


DA>

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
DA>{
DA>    if (nCode >= 0) {
DA>        switch (state) {
DA>            case 0:
DA>                if (wParam == VK_CONTROL)
DA>


DA>Нажатие на одну клавишу создает три сообщения: KeyDown, KeyPress, KeyUp. Я хочу обрабатывать только KeyDown. В MSDN написано, что если 31 бит lParam равен нулю, то клавиша нажата, иначе клавиша отжата. Я пишу


DA>

DA>if ((wParam == VK_CONTROL) && !(lParam & 80000000))
DA>


DA>Но это условие выполняется уже два раза, а не три при нажатии на одну клавишу. Как сделать, чтобы оно выполнялось один раз?

lParam
0-15
Specifies the repeat count. The value is the number of times the keystroke is repeated as a result of the user's holding down the key.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up.
Попробуй обработать количество повторений и/или предыдущее состояние.

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 20.10.05 17:46

Ответить на сообщение Ответить с цитированием

Re: KeyDown, KeyPress, KeyUp Сообщить модератору
Alex Fedotov 

 

Здравствуйте, DmitriAl, Вы писали:

DA>Нажатие на одну клавишу создает три сообщения: KeyDown, KeyPress, KeyUp. Я хочу обрабатывать только KeyDown. В MSDN написано, что если 31 бит lParam равен нулю, то клавиша нажата, иначе клавиша отжата. Я пишу


DA>


DA>if ((wParam == VK_CONTROL) && !(lParam & 80000000))
DA>

Что, прямо так и написано? Или, все-таки, 0x80000000?

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 20.10.05 18:03

Ответить на сообщение Ответить с цитированием

Re[2]: KeyDown, KeyPress, KeyUp Сообщить модератору
DmitriAl 

 

Здравствуйте, Alex Fedotov, Вы писали:


LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{    
    if (code >= 0) {
        FILE *out = fopen("hello.txt", "a");
        fprintf(out, "%x\t%x\n", wParam ,lParam);
        fclose(out);
        switch (state) {
            case 0:
                if ((wParam == VK_C) && (lParam & 0x80000000))
                    PostMessage(GlobalParent, WM_USER, (int)lParam, 0);
                break;                
        }
    }
    return CallNextHookEx(hHook, code, wParam, lParam);
}

output:
43 2e0001
43 2e0001
43 c02e0001
43 c02e0001
Почему???

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 20.10.05 18:47

Ответить на сообщение Ответить с цитированием

Re[3]: KeyDown, KeyPress, KeyUp Сообщить модератору
Alex Fedotov 

 

Здравствуйте, DmitriAl, Вы писали:

DA>Здравствуйте, Alex Fedotov, Вы писали:


DA>


DA>LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
DA>{    
DA>    if (code == HC_ACTION) {
DA>        FILE *out = fopen("hello.txt", "a");
DA>        fprintf(out, "%x\t%x\n", wParam ,lParam);
DA>        fclose(out);
DA>        switch (state) {
DA>            case 0:
DA>                if ((wParam == VK_C) && (lParam & 0x80000000))
DA>                    PostMessage(GlobalParent, WM_USER, (int)lParam, 0);
DA>                break;                
DA>        }
DA>    }
DA>    return CallNextHookEx(hHook, code, wParam, lParam);
DA>}
DA>


DA>output:


DA>43 2e0001

DA>43 2e0001
DA>43 c02e0001
DA>43 c02e0001

DA>Почему???

Потому что надо проверять код на HC_ACTION, как показано выше.

Данное сообщение получено с сайта RSDN, ссылка на исходное сообщение 

Отправлено: 20.10.05 18:53

Ответить на сообщение Ответить с цитированием

Правила использования | Политика защиты | Кодекс поведения | Обратная связь
© 2002-2006 Корпорация Microsoft. Все права защищены.
Создание сайта - Metric
Хостинг на Parking.ru
Рейтинг@Mail.ru HotLog Rambler's Top100
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함