![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отловить событие с клавиатуры или мыши в неактивном приложении?
sohat © (2004-07-29 15:48:00)нужно посчитать сколько времени юзер был "неактивен" не юзал мышку или клавиатуру, а как отловить событие в неактивной программе не знаю, помогите пожалуйста.
prosoft (2004-07-30 14:32:00) [1]function LastInput: DWord;
var
LInput: TLastInputInfo;
begin
LInput.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(LInput);
Result := GetTickCount - LInput.dwTime;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption := Format('System Idle since %d ms', [LastInput]);
end;
Работает только в Win2k и старше.
Игорь Шевченко (2004-07-30 12:34:00) [2]
> От глобальных ловушек иногда падают драйвера, их надо
> избегать.
????????????????
Digitman (2004-07-30 12:23:00) [3]
> R © (30.07.04 12:01) [12]
> От глобальных ловушек иногда падают драйвера, их надо
> избегать.
важное уточнение - от КРИВО реализованных и поставленных
R (2004-07-30 12:01:00) [4]От глобальных ловушек иногда падают драйвера, их надо
избегать.
Юрий Зотов (2004-07-30 11:11:00) [5]> grom (30.07.04 09:10) [8]
> В notepad работает.
Извините, не верю. Яблоки вверх не падают, а хук, поставленный в exe, за пределами этого exe не работает. А при локальном по отношению к системе объявлении HookHandle он и в DLL нормально работать не будет.
Digitman (2004-07-30 09:32:00) [6]
> grom
не есть корошо приводить пример, не делающий то что заявлено в комментарии к нему
grom (2004-07-30 09:15:00) [7]Digitman © (30.07.04 09:07) [7]
Ну это просто пример, а далее решать что делать автору этой ветки.
grom (2004-07-30 09:10:00) [8]В notepad работает.
Может нибудит работать в каких то играх.
Digitman (2004-07-30 09:07:00) [9]
> grom (29.07.04 21:26) [5]
1. глоб.ловушка должна быть реализована в DLL, а не в обычном EXE
2. глоб.ловушка НЕ отслеживает польз.ввод в консольных win32-приложениях и окнах DOS-задач
Юрий Зотов (2004-07-30 07:57:00) [10]> grom (29.07.04 21:26) [5]
> Какая программа?
Любая, кроме Вашей. Хотя бы Notepad, например.
grom (2004-07-29 21:26:00) [11]Проверял на ХР работает нормально.
когда активна другая программа?
Какая программа?
Юрий Зотов (2004-07-29 20:22:00) [12]> grom (29.07.04 19:22) [3]
Извините, а Вы уверены, что это будет именно "по всей Windows"? Сами проверяли? Например, когда активна другая программа?
grom (2004-07-29 19:22:00) [13]Отследить события мыши и клавиатуры во всей Windows
var
HookHandle: hHook;
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
key: integer;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of
WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);
WM_LBUTTONDOWN: CheckBox1.Checked := true;
WM_LBUTTONUP: CheckBox1.Checked := false;
WM_RBUTTONDOWN: CheckBox2.Checked := true;
WM_RBUTTONUP: CheckBox2.Checked := false;
WM_KEYUP: CheckBox3.Checked := false;
WM_KEYDOWN: begin
CheckBox3.Checked := true;
key := msg.paramL and 255;
if key in [48..57, 65..90]
then Edit1.Text := Edit1.Text + chr(key);
end;
end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CheckBox1.Caption := 'left button';
CheckBox2.Caption := 'right button';
CheckBox3.Caption := 'keyboard';
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
Edit1.Text := '';
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle > 0 then
UnhookWindowsHookEx(HookHandle);
end;
Игорь Шевченко (2004-07-29 16:58:00) [14]1) GetLastInputInfo для Win2k и выше
2) Работа с msidle.dll для Win9x
3) Делание глобальных хуков WH_KEYBOARD и WH_MOUSE самому.
Юрий Зотов (2004-07-29 16:14:00) [15]Глобальный хук (вернее, два глобальных хука). См. статью Алексея Павлова.