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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отследить что нажимают клавиши, На клавиатуре 
:(
    Опции темы
SlaUr
Дата 21.12.2004, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Появилась задачка :
мне нужно отследить нажимает ли пользователь клавиши на клавиатуре (не важно какие) или нет,также нужно определить работает ли пользователь с мышью.
С мышью я думаю просто - смотреть в таймере за координатами мыши а вот с клавиатурой не знаю как сделать.
Поясню зачем это надо - нужно удаленно знать работает ли в данный момент человек за компьютером (или покурить вышел).

Добавлено:
Нашел в DRKB про глобальную ловушку клавиатуры - может это мне поможет.


Это сообщение отредактировал(а) SlaUr - 21.12.2004, 06:42
PM MAIL   Вверх
Ddddddelphi
Дата 21.12.2004, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код


//код 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.

//это код самой программы:

unit KeyUn;

interface

uses WinTypes, Messages, Forms, SysUtils;
const
 KeyEvent = WM_USER + 1;

type
 TKeyForm = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   procedure WM_NextMSG(var Msg: TMessage); message KeyEvent;
 public
   hLib: THandle;
 end;

var
 KeyForm: TKeyForm;

implementation
{$R *.DFM}

function SetKeyHook: Longint; external 'Key' index 1;
function KeyHook: Longint; external 'Key' index 2;
function DelKeyHook: Longint; external 'Key' index 3;


procedure TKeyForm.WM_NextMSG(var Msg: TMessage);
begin
 beep;
end;

procedure TKeyForm.FormCreate(Sender: TObject);
begin
 hLib := LoadLibrary('Key.dll');
 SetKeyHook;
end;

procedure TKeyForm.FormDestroy(Sender: TObject);
begin
 DelKeyHook;
 FreeLibrary(hLib);
end;

end.


PM MAIL   Вверх
SlaUr
Дата 21.12.2004, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ddddddelphi:Спасибо
Правда работает только с dll (без dll чисто в проекте ничего не получилось)
Придется таскать DLL-шку c собой .



Это сообщение отредактировал(а) SlaUr - 21.12.2004, 08:40
PM MAIL   Вверх
Ddddddelphi
Дата 21.12.2004, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



SlaUr, глобальные ловушки работают только с dll smile
PM MAIL   Вверх
Bes
Дата 21.12.2004, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть еще функция которая отслеживает нажатие клавиши без дллки
вроде GetAnsiKeyState чтоли? функция возвращает true если клавиша нажата. работает аппаратно так что дллка не нужна. вроде так, если я ничего не путаю. я точно пользовался щас гляну конкретно.

ВОТ! точно
ставь на форму таймер с интервалом 1 в обработчике пиши
caption:=inttostr(GetKeyState(13)); //клавиша ентер
понажимай ентер увидишь что получиться.

- этого метода - для каждой клавиши придется писать свою строчку
getkeystate(...) зато без длл... :-)

Это сообщение отредактировал(а) Bes - 21.12.2004, 09:29
PM MAIL   Вверх
SlaUr
Дата 21.12.2004, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно в принципе сделать GetKeyStat на несколько часто нажимаемых клавишах например a,A,А,а (lat/rus) ,o,e,enter,Esc, в принципе тоже мне подойдет но лучше с ловушкой - dll небольшая так что можно и потаскать с собой.

Это сообщение отредактировал(а) SlaUr - 21.12.2004, 10:00
PM MAIL   Вверх
Bes
Дата 21.12.2004, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



2SlaUr: там без разницы рус/латышский :-)
я просто тоже пробовал через дллку - толи у меня руки кривые, толи теория хромает, но че-то глючно у меня прога работала не всегда схватывала.
А! точно она повторы не делала т.е. ОБРАТИТЕ ВНИМАНИЕ!!!
когда ты этот хук запустишь нельзя будет сделать
аааааааааааааааааааааааааааааааааааааааааа
т.е. держать клавишу и печатать а получиться просто
а
может у вас конечно более продвинутая версия, но у меня был такой глюк.
получается ее не только заметно, т.к. вы пишете на шпиона :-) а просто не удобно работать.
если я не прав - отпишите.
PM MAIL   Вверх
SlaUr
Дата 21.12.2004, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



BesВсе работает нормально (для моих целей -мне неважно какая клавиша нажата и я ее не считываю а как в примере просто проигрывается звук (messageBeep(0) (Вместо Beep)) Сколько раз нажимаю A столько раз возпроизводится звук,Держу А постоянно нажатой - звук тоже постоянно раздается.

Это сообщение отредактировал(а) SlaUr - 21.12.2004, 12:49
PM MAIL   Вверх
Bes
Дата 21.12.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну то есть повтор работает.. ?
в блокноте например можно длинную строку напечатать удерживая клавишу?
PM MAIL   Вверх
SlaUr
Дата 22.12.2004, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



BesПовтор работает.

PM MAIL   Вверх
Bes
Дата 27.12.2004, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Дай пример. :-)
PM MAIL   Вверх
SlaUr
Дата 28.12.2004, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Besисходники (1.rar)
Вообще то я сейчас посмотрел- я сделал не через сообщение а напрямую в dll написал messagebeep и все работает,если не работает через ссообщения то нужно будет что-то мудрить.

p.s. Программу в котрой я буду это использовать я еще не делаю(сначала спрошу у начальника надо ли это )

Это сообщение отредактировал(а) SlaUr - 28.12.2004, 16:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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