Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2013, 20:29
centuriy centuriy вне форума
Прохожий
 
Регистрация: 03.11.2012
Сообщения: 5
Репутация: 10
По умолчанию Глобальный хук и WM_KEYUP

Здравствуйте! Все таки решился использовать dll для хука, только пожалуйста помогите разобраться коде данной функции, не могу его переделать чтоб хук реагировал только при отпускании (KeyUP) клавиши:

Код:
function KeyHookFunc(Code, VirtualKey, KeyStroke: integer): LRESULT; stdcall;
var
  msgl: PEVENTMSG;
begin
  Result:=0;
  if Code=HC_NOREMOVE then Exit;
  Result:=CallNextHookEx(hK,Code,VirtualKey,KeyStroke);
  if Code<0 then Exit;
  if (Code=HC_ACTION) then
  begin
    msgl := Pointer(KeyStroke);     // Без этих двух строчек функция работает
    if msgl.message = WM_KEYUP then // идеальною, но надо чтоб хук реагировал только
    begin                           // на отпускание клавиш. П О М О Г И Т Е !
      if((KeyStroke and (1 shl 30))<>0) then
      if not IsWindow(hA) then
      begin
        hM:=OpenFileMapping(FILE_MAP_WRITE,False,'MyHookMap');
        Hr:=MapViewOfFile(hM,FILE_MAP_WRITE,0,0,0);
        if Hr<>nil then
          hA:=Hr.AppHnd;
      end;
      if ((KeyStroke and (1 shl 30))<>0) then
      begin
        SendMessage(hA, WM_USER+2008, VirtualKey ,  KeyStroke {GetFocus});
      end;
    end;
  end;
end;
Ответить с цитированием
  #2  
Старый 11.02.2013, 09:45
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
LRESULT CALLBACK KeyboardProc(
    int code,	// hook code
    WPARAM wParam,	// virtual-key code
    LPARAM lParam 	// keystroke-message information
   );

Цитата:
lParam

Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag. This parameter can be a combination of the following values:

Value Description
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.
16-23 Specifies the scan code. The value depends on the original equipment manufacturer (OEM).
24 Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.
25-28 Reserved.
29 Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
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.
31 Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 11.02.2013, 10:04
centuriy centuriy вне форума
Прохожий
 
Регистрация: 03.11.2012
Сообщения: 5
Репутация: 10
По умолчанию

NumLock, спасибо конечно за быстрый ответ, но я уже читал про это... вот только как мне в данной функции реагировать только на отпускание клавиши? Можно примерчик?...
Ответить с цитированием
  #4  
Старый 11.02.2013, 10:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
if (KeyStroke and $80000000 <> 0) then
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
centuriy (11.02.2013)
  #5  
Старый 11.02.2013, 10:34
centuriy centuriy вне форума
Прохожий
 
Регистрация: 03.11.2012
Сообщения: 5
Репутация: 10
По умолчанию

NumLock, Спасибо! вместо условия
Код:
if ((KeyStroke and (1 shl 30))<>0) then
вставил
Код:
if (KeyStroke and $80000000 <> 0) then
и все работает как надо...
ps. я так понял условие
Код:
if ((KeyStroke and (1 shl 30))<>0) then
отвечало за нажатие клавиши (KEY DOWN)??? я прав?
Ответить с цитированием
  #6  
Старый 11.02.2013, 10:56
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ты не тот бит проверял, на 1 ошибся:
1 shl 30 = $40000000, а надо $80000000 в маске
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
centuriy (11.02.2013)
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter