Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизОтловить событие с клавиатуры или мыши в неактивном приложении? Найти похожие ветки
← →
sohat (2004-07-29 15:48) [0]нужно посчитать сколько времени юзер был "неактивен" не юзал мышку или клавиатуру, а как отловить событие в неактивной программе не знаю, помогите пожалуйста.
← →
Юрий Зотов © (2004-07-29 16:14) [1]Глобальный хук (вернее, два глобальных хука). См. статью Алексея Павлова.
← →
Игорь Шевченко © (2004-07-29 16:58) [2]1) GetLastInputInfo для Win2k и выше
2) Работа с msidle.dll для Win9x
3) Делание глобальных хуков WH_KEYBOARD и WH_MOUSE самому.
← →
grom (2004-07-29 19:22) [3]Отследить события мыши и клавиатуры во всей 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 20:22) [4]> grom (29.07.04 19:22) [3]
Извините, а Вы уверены, что это будет именно "по всей Windows"? Сами проверяли? Например, когда активна другая программа?
← →
grom (2004-07-29 21:26) [5]Проверял на ХР работает нормально.
когда активна другая программа?
Какая программа?
← →
Юрий Зотов © (2004-07-30 07:57) [6]> grom (29.07.04 21:26) [5]
> Какая программа?
Любая, кроме Вашей. Хотя бы Notepad, например.
← →
Digitman © (2004-07-30 09:07) [7]
> grom (29.07.04 21:26) [5]
1. глоб.ловушка должна быть реализована в DLL, а не в обычном EXE
2. глоб.ловушка НЕ отслеживает польз.ввод в консольных win32-приложениях и окнах DOS-задач
← →
grom (2004-07-30 09:10) [8]В notepad работает.
Может нибудит работать в каких то играх.
← →
grom (2004-07-30 09:15) [9]Digitman © (30.07.04 09:07) [7]
Ну это просто пример, а далее решать что делать автору этой ветки.
← →
Digitman © (2004-07-30 09:32) [10]
> grom
не есть корошо приводить пример, не делающий то что заявлено в комментарии к нему
← →
Юрий Зотов © (2004-07-30 11:11) [11]> grom (30.07.04 09:10) [8]
> В notepad работает.
Извините, не верю. Яблоки вверх не падают, а хук, поставленный в exe, за пределами этого exe не работает. А при локальном по отношению к системе объявлении HookHandle он и в DLL нормально работать не будет.
← →
R © (2004-07-30 12:01) [12]От глобальных ловушек иногда падают драйвера, их надо
избегать.
← →
Digitman © (2004-07-30 12:23) [13]
> R © (30.07.04 12:01) [12]
> От глобальных ловушек иногда падают драйвера, их надо
> избегать.
важное уточнение - от КРИВО реализованных и поставленных
← →
Игорь Шевченко © (2004-07-30 12:34) [14]
> От глобальных ловушек иногда падают драйвера, их надо
> избегать.
????????????????
← →
prosoft (2004-07-30 14:32) [15]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 и старше.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c