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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.02.2011, 13:01   #1
Dj_SheLL
Форумчанин
 
Аватар для Dj_SheLL
 
Регистрация: 14.10.2009
Сообщений: 128
По умолчанию Перехват нажатий клавиш клавиатуры

Здравствуйте,уважаемые!
Начал недавно изучать хук клавы и мыши.Решил сделать простое отслеживание нажатие клавиш.Т.е. вы нажимаете любую клавишу клавы,а прога ведёт счёт нажатий.Сделал всё "по науке" через dll,но проблема вот в чём,програ отслеживает не только нажатие,но и отпускание,а оно мне не нужно.
Вот сама dll-ка:
Код:
library key;
uses
  wintypes,
  winprocs,
  messages;

const
keyevent = wm_user + 1;

var
hookhandle: hhook;

function keyhook(code: integer; wparam: word; lparam: longint): longint;
var
wnd: hwnd;
begin
if code >= 0 then begin
wnd := findwindow('tkeyform', nil);
sendmessage(wnd, keyevent, wparam, lparam);
result := 0;
end else
result:=callnexthookex(hookhandle, code, wparam, lparam);
end;

procedure setkeyhook;
begin
hookhandle:=setwindowshookex(wh_keyboard, @keyhook, hinstance, 0);
end;

procedure delkeyhook;
begin
if hookhandle <> 0 then
unhookwindowshookex(hookhandle);
end;

exports
setkeyhook index 1,
keyhook index 2,
delkeyhook index 3;

begin
end.
Ещё в private процедура,в которой собственно я веду счёт нажатиям.
Код:
procedure WM_NextMsg(var msg: tmessage); message keyevent;
Подскажите пожалуйста в чём может быть проблема и куда "копать".
И проблема ещё в ворде-при нажатии+отжатии считается по 5 раз того и того
Dj_SheLL вне форума Ответить с цитированием
Старый 09.02.2011, 14:34   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> в чём может быть проблема

в том, что игнорируются wparam и lparam

> и куда "копать".

в мсдн. Там написано, как отличить нажатие от отжатия.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 17.10.2014, 16:59   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Продолжу тему...
Странная штука. Нашёл dll перехватчика. Всё, вроде, что мне надо, работает.
Но при этом происходит странная штука: после запуска программы с перехватчиком блокируется многократное нажатие (например, если удерживать "=", то оно один раз наберётся и всё, а не начнёт строчить "================="
И ещё что-то происходит с альт-табом. На семёрке, например, не пропадает "окно" выбора программ из запущенных пока по программе не щёлкнешь мышкой.
Причём при закрытии программы это не проходит...
В чём может быть причина?

Код:
library SendKey;

uses
  SysUtils,
  Classes,
  Windows,
  Messages;

const

  {пользовательские сообщения}
  wm_MyKeyDown = wm_User + 133;

  {handle для ловушки}

var

  SaveExitProc: Pointer;
  HookHandle: hHook;// = 0;
  H: HWND;

  {собственно ловушка}

function Key_Hook(Code: integer; wParam: word;
  lParam: Longint): Longint; stdcall; export;
begin

  {если Code>=0, то ловушка может обработать событие}
  if (Code >= 0) and (lParam and $40000000 = 0) then
  begin
    {ищем окно по имени класса и по заголовку
    (Caption формы управляющей программы должен быть равен 'XXX' !!!!)}
    H := FindWindow('TForm1', 'Form1');

    {это те клавиши?}
     SendMessage(H, wm_MyKeyDown, wParam, 0);
    {если 0, то система должна дальше обработать это событие}
    {если 1 - нет}
    Result := 0;
  end

  else if Code < 0 {если Code<0, то нужно вызвать следующую ловушку} then
    Result := CallNextHookEx(HookHandle, Code, wParam, lParam);
end;

{при выгрузке DLL надо снять ловушку}

procedure LocalExitProc; far;
begin

  if HookHandle <> 0 then
  begin
    UnhookWindowsHookEx(HookHandle);
    ExitProc := SaveExitProc;
  end;
end;

exports Key_Hook;

{инициализация DLL при загрузке ее в память}
begin
  {устанавливаем ловушку}

  HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
  if HookHandle = 0 then
    MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)
  else
  begin
    SaveExitProc := ExitProc;
    ExitProc := @LocalExitProc;
  end;
end.
Ship_1 вне форума Ответить с цитированием
Старый 20.10.2014, 22:56   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых ты не всегда возвращаешь нажатие дальше по цепочке, отсюда и могут быть глюки. Имею ввиду Result := 0;
Во-вторых, вообще не пойму зачем тебе перехват, чтоб послать его сообщением в твою же форму...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2014, 08:46   #5
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Попробовал понять что исправить, чтобы нажатие всегда возвращалось в цепочку, но так и не понял...
Перехват - чтобы форма получала клавиши, нажатые в другом окне, не мешая самому вводу в другое окно.
Ship_1 вне форума Ответить с цитированием
Старый 21.10.2014, 09:49   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ранновато тебе перехваты писать... Лучше бы теорию подтянул по хукам.
Я лично рекомендую использовать хук WH_JOURNALPLAYBACK
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2014, 10:13   #7
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Что ж мне теперь оставлять программку с глюком?... Пока я подтяну теорию - много времени пройдёт, у меня сейчас сильная загрузка по работе, а программка почти готовая, только с небольшим глюком... Или его сложно так просто исправить?
Для подтягивания это пойдёт?
Ship_1 вне форума Ответить с цитированием
Старый 21.10.2014, 10:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пойми. Хуки разрабатывались не для их применения в боевых условиях.
Я не знаю накой тебе такой изврат как хуки нужен, поэтому скалю зубы в сторону "прогу фтопку". Лично я бы так и сделал. Уверен что есть другие более надежные и правильные пути решить твою задачу.
Других советов не будет. По крайней мере от меня.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Эмуляция нажатий клавиш BorisBritva Общие вопросы Delphi 1 01.11.2010 13:09
Перехват нажатий клавиш - АLT chandrasecar Win Api 8 27.11.2008 16:12
симуляция нажатий клавиш 4321 Общие вопросы Delphi 14 23.10.2008 23:18
Иммитация нажатий клавиш клавиатуры chandrasecar Win Api 5 11.10.2008 12:16
отслеживание нажатий клавиш Артэс Win Api 6 14.06.2008 20:02