Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> hook на keyboard, помогите доделать... 
:(
    Опции темы
Ищущий!
Дата 26.6.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Вот код библиотеки! 
Вопрос, сообщение с нажатой кнопкой вылазеет при keyup и keydown, то есть 2 раза.. ка сделать, что бы выскакивала 1 раз при up или down 
Код

library hook;

uses Windows, Messages, dialogs;

const 
MMFName:PChar='Keys'; 

var 
 SysHook : HHook = 0;
 Wnd : Hwnd = 0;

function ShiftDown : Boolean;
var 
  State : TKeyboardState; 
begin 
  GetKeyboardState(State); 
  Result := ((State[vk_Shift] and 128) <> 0); 
end;

function KeyboardProc(code:integer;wParam:word;lParam:longint):longint;stdcall;
var msg: PEVENTMSG;
begin
  CallNextHookEx(SysHook,Code,wParam,lParam);
   msg := Pointer(LParam);
    if(code=HC_ACTION)
      AND
     ((wParam>=65)and(wParam<=90))
  then
    begin
      if(shiftdown())then
        showmessage(char(wparam))
      else
         showmessage(char(wparam+32))
      end;

    Result:= 0;
    end;


procedure RunStopHook(State : Boolean) export; stdcall;
begin
 if State=true then
  begin
   SysHook := SetWindowsHookEx(WH_KEYBOARD,
      @KeyboardProc, HInstance, 0);
  end
 else
  begin

   UnhookWindowsHookEx(SysHook);
   SysHook := 0;
  end;
end;

exports RunStopHook index 1;

begin
end.
 
PM MAIL   Вверх
Alexeis
Дата 26.6.2006, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Ищущий!, параметр lParam указывает тип события если его значение 
Цитата

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.
 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ищущий!
Дата 26.6.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



ага.. пасиб.. а причем тогда 30 и 31? 
PM MAIL   Вверх
Yanis
Дата 26.6.2006, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 13
Всего: 111



Цитата(Ищущий! @  26.6.2006,  19:06 Найти цитируемый пост)
а причем тогда 30 и 31?  

Номера бит. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ищущий!
Дата 26.6.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Ой.. ничего не понятно.. могете мой пример подправить? 
PM MAIL   Вверх
Alexeis
Дата 28.6.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Ищущий! @  26.6.2006,  18:51 Найти цитируемый пост)
Ой.. ничего не понятно..

значение lParam - есть 32 битное целое число
Например в двоичной системе
101110110011100110101010101110100
Если 30 по счету бит установлен в 1 то перед отправкой сообщения кнопка была еще нажата
1(0)1110110011100110101010101110100
указанный бит взят в скобки
Как проверить его состояние? Да легко
Код

if (lParam and $40000000) > 0
then
  ShowMessage('нажата');

Поясняю 40000000 в 16-ти ричном представлении
01000000000000000000000000000000
т.о. мы занулили в числе все биты кроме нужного
Если число не равно нулю значит бит был таки установлен, если нет,
то  0 and 1 = 0 и все биты в полученном числе будут нулями и соответствено все число будет равно нулю. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ищущий!
Дата 28.6.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 19.4.2005

Репутация: нет
Всего: нет



Аха.. ясно.. пасиб.. smile 
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.