Вниз
Скачать: CL | DM;

блокирока мыши и клавы в чужом приложении не трогая своё   Найти похожие ветки 

← →
Novichek ©   (2002-10-10 02:19) [0]

можно ли блокировать мышь и клаву в чужом приложении но не трогая свою(мои горячие клавиши, простой ввод(hook) и т.д.)?


← →
Rouse_ ©   (2002-10-10 02:31) [1]

Очевидно придется ставить хук

Желаю успехов


← →
Novichek ©   (2002-10-10 02:36) [2]

как? перехват клавиш в чужой программе что бы они не доходили до цели? а как? у меня все время как-то глобально получается... :((


← →
rhf ©   (2002-10-10 02:49) [3]

setWindowsHookEx()
.....
dwThreadId
Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads.


← →
Novichek ©   (2002-10-10 03:23) [4]

ай м сори, а по-русски, будь ласка...


← →
Rouse_ ©   (2002-10-10 03:28) [5]

Грубо говоря определяет какому потоку (читай приложению) отправлено сообщение, если параметр нулевой то сообщение отправлено всем

Желаю успехов


← →
Novichek ©   (2002-10-10 03:51) [6]

а как узнать какое приложение (считая и моё) сейчас активное?


← →
Rouse_ ©   (2002-10-10 04:08) [7]

GetForegroundWindow

PS: Обычно при получении списка процессов, активный процесс находится самым первым, но это не надежно, просто к сведению

Желаю успехов


← →
Novichek ©   (2002-10-10 04:46) [8]

а мжно поподробнее?!


← →
Rouse_ ©   (2002-10-10 04:52) [9]

А что тут подробнее? GetForegroundWindow дает хэндл текущего активного окна. Получение списка процессов есть в FAQ

Желаю успехов


← →
rhf ©   (2002-10-10 04:58) [10]

я вобщето имел ввиду, что можно поставить хук не на все потоки, а только на тот в котором нужное приложение.
Если это не устраивает, то обрабатывая сообщение всегда можно посмотреть кому оно предназначаеться и если нужно, то обнулить.


← →
Novichek ©   (2002-10-10 05:53) [11]

а как? (разжуйте пожалуйста!)


← →
Rouse_ ©   (2002-10-10 05:59) [12]

Примеры хуков есть на сайте, посмотри их, разберись как они работают и там все поймешь (статьи и FAQ), вот если не поймешь что-то тогда задавай конкретный вопрос, так будет проще, Юрий Зотов в свое время такие рукописи выкладывал ;))

Желаю успехов


← →
Novichek ©   (2002-10-10 06:03) [13]

дык в том то и дело что все они глобальные, а что бы закрыть какое-то отдельное приложение на чувствительность к клавиатуре, такого нет! что делать, как это исправить?


← →
Rouse_ ©   (2002-10-10 06:07) [14]

Подожди, я что тебе посоветовал? РАЗОБРАТЬСЯ как работает хук, как только поймешь метод его реализации, сразуже найдешь ответ на свой вопрос.

Желаю успехов


← →
Novichek ©   (2002-10-10 06:12) [15]

да, блин, мозгов уменя не хватает!!! есть только рабочий пример и всё... :((((


← →
Rouse_ ©   (2002-10-10 06:14) [16]

Давай его сюда будем разжевывать по полочкам, пометь места которые не понятны

Желаю успехов


← →
Novichek ©   (2002-10-10 06:29) [17]

да, в принципе стандартный пример, взятый здесь же:
DLL:

Library HookDLL;

Uses
Windows, Messages, SysUtils;

Const
GlobMapID = "Global Keyboard Hook Demo {917C91AA-88D5-4134-BB91-15161728594D}";

Type
PShareInf = ^TShareInf;
TShareInf = Record
AppWndHandle: HWND;
OldHookHandle: HHOOK;
hm:THandle;
End;

Var
MapHandle: THandle = 0;
ShareInf: PShareInf = nil;
ptr:PByteArray;

Procedure DLLEntryPoint(dwReason: DWORD); stdcall;
Begin
Case dwReason Of
DLL_PROCESS_ATTACH:
Begin
MapHandle:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TShareInf), GlobMapID);
ShareInf:=MapViewOfFile(MapHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TShareInf));
End;
DLL_PROCESS_DETACH:
Begin
UnMapViewOfFile(ShareInf);
CloseHandle(MapHandle);
End
End;
End;

Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamW, Code);
End;
Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL)
End;

Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall;
Begin
If ShareInf<>Nil Then
Begin
ShareInf^.AppWndHandle:=Wnd;
ShareInf^.OldHookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyboardHook, HInstance, 0);
Result:=ShareInf^.OldHookHandle<>0;
End
Else Result:=False
End;

Function RemoveKeyboardHook: BOOL; stdcall;
Begin
Result := UnhookWindowsHookEx(ShareInf^.OldHookHandle);
CloseHandle(ShareInf^.hm);
End;

Exports
SetKeyboardHook, RemoveKeyboardHook;

BEGIN
// эта строка у меня не откомпилировалась почему-то
// If DLLProc = Nil Then DLLProc := @DLLEntryPoint;

DLLEntryPoint(DLL_PROCESS_ATTACH);
END.


САМА прога (каркас проги)

Unit Main;

INTERFACE

Uses
Windows, Messages, Classes, Controls, Forms, StdCtrls, Buttons;

Type
TMainForm = Class(TForm)
ClearButton: TButton;
Memo1: TMemo;
Button1: TButton;
Procedure ClearButtonClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
Private
Procedure WMUser(Var Message: TMessage); Message WM_USER;
Protected
End;

Var
MainForm: TMainForm;

IMPLEMENTATION
Uses SysUtils;
{$R *.DFM}
procedure BlockInput(Block : boolean);stdcall; external "user32.dll";

Function SetKeyboardHook(Wnd: HWND): BOOL; stdcall; external "HookDLL.dll" name "SetKeyboardHook";
Function RemoveKeyboardHook: BOOL; stdcall; external "HookDLL.dll" name "RemoveKeyboardHook";

Procedure TMainForm.WMUser(var Message: TMessage);
Begin
if (message.WParam>=96) and (Message.WParam<=105)then
Memo1.Lines.Add("Code: "+IntToStr(Message.WParam-48)+"; Char: "+Chr(Message.wParam-48))
else
Memo1.Lines.Add("Code: "+IntToStr(Message.WParam)+"; Char: "+Chr(Message.wParam));
End;

Procedure TMainForm.ClearButtonClick(Sender: TObject);
Begin
Memo1.Lines.Clear;
End;

// блокировка клавы и мыши
procedure TMainForm.Button1Click(Sender: TObject);
begin
BlockInput(true);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
If NOT SetKeyboardHook(Handle) Then
MessageBox(Handle, "Unable to set hook", PChar(Application.Title), MB_OK OR MB_ICONHAND);
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BlockInput(false); // разблокировка клавы и мыши
If NOT RemoveKeyboardHook Then
MessageBox(Handle, "Unable to remove hook", PChar(Application.Title), MB_OK OR MB_ICONHAND);
end;

End.


← →
Rouse_ ©   (2002-10-10 06:40) [18]


> Function KeyboardHook(Code : Integer; ParamW: WPARAM; ParamL:
> LPARAM): LRESULT;stdcall;

Вот что тебя должно интересовать

Желаю успехов


← →
Novichek ©   (2002-10-10 06:44) [19]

каким образом? (разжуй пожалуйста!!!!)


← →
Rouse_ ©   (2002-10-10 07:02) [20]

Там как раз передаются параметры какая клавиша нажата и какому приложению адресовано сообщение (вот точно что где не помню а проверять лениво я просто через час выхожу из инета а у нас с тобой еще запуск эксплорера не решен) посмотри тем же стартером какой хэндр у интересуещего тебя приложения и посмотри где он проходит в каком параметре, а после просто делаешь, смотришь если сообщение идет нужному приложению то просто меняешь Code на ноль

Кажется так

Желаю успехов


← →
Novichek ©   (2002-10-10 07:25) [21]

да, но я то блокирую все приложения (BlockInput"ом)! (соответственно и своё) а как заблокировать все кроме моего?


← →
Rouse_ ©   (2002-10-10 07:35) [22]

Просто пропускаешь все сообщения адресованные твоей программе, а для остальных CODE заменяешь на ноль (как будто ничего не нажималось)

BlockInput соответственно снять

Желаю успехов


← →
Novichek ©   (2002-10-10 07:44) [23]

дурацкий вопрос, но всё же => CODE и handle моей проги одно и тоже? если нет, то где вставить проверку?


← →
Rouse_ ©   (2002-10-10 07:55) [24]

Не-не CODE = код нажатой клавиши а handle либо в ParamW либо в ParamL, я вот и говорю, что не помню точно

Желаю успехов


← →
Novichek ©   (2002-10-10 08:04) [25]

один хрен, не работает :(((((( ну хоть плач...


← →
vidiv   (2002-10-10 08:14) [26]

Rouse_ >> Code - это не код нажатой клавиши, последний в Param-ах где-то.

>>
А к стати Novichek, а без Dll слабо сделать


← →
vidiv   (2002-10-10 08:16) [27]

Rouse_ >> Code - это не код нажатой клавиши, последний в Param-ах где-то.
Вот из helpa:
LRESULT CALLBACK KeyboardProc(

int code, // hook code - но не как ни код нажатой клавиши
WPARAM wParam, // virtual-key code - вот он код
LPARAM lParam // keystroke-message information
);

>>
А к стати Novichek, а без Dll слабо сделать


← →
Rouse_ ©   (2002-10-10 08:16) [28]

Давай так, я сегодня просто всю ночь просидел, голова уже просто не соображает, я как только прийду в себя сяду и сделаю с нуля все что тебе нужно, а потом тебе почтой отошлю ок? Я вчера так тоже двоим сделал, просто сейчас я действительно уже начинаю похуже вникать. А за это время мож кто-то еще что посоветует

Желаю успехов


← →
Novichek ©   (2002-10-10 08:25) [29]

попробуй, мой е-майл: sanek@sed.lg.ua только ж ты понял какая задача? блок клавы и мыши вовсех приложениях кроме моего, а в моем отображение набора клавы после блока приложений (моя прога, после блокировки клавиатуры и мыши, в граф режиме отображает на мониторе символы приходящие с клавы и плюс анализирует их) помоги пожалуйста, если можешь.


← →
Rouse_ ©   (2002-10-10 08:32) [30]


> vidiv (10.10.02 08:16)

Я же говорил что могу ошибаться, спасибо что поправили ;)



← →
Rouse_ ©   (2002-10-11 07:01) [31]

Мда, поспал хорошо, и сразуже увидел всю сумбурность своих вчерашних высказываний ;) Не пинайте меня просто долгое сиденье за отладкой кода притупляет мозги

Вот решение
Изменить функцию в библиотеке

Function KeyboardHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
var tmp: THandle;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
tmp := GetForegroundWindow; //Вот здесь проверка
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamL, Code);
if tmp <> ShareInf^.AppWndHandle then Exit; //Блокируем все сообщения не нашей программе
End;
Result := CallNextHookEx(ShareInf^.OldHookHandle, Code, ParamW, ParamL);
End;


Как результат смотрим какое приложение активно, и если не наше, то просло не пересылаем сообщение о нажатой клавише дальше по цепочке хуков

Желаю успехов

ЗЫ: Продублирую мылом


← →
Song ©   (2002-10-11 09:12) [32]

Надо было просто запретить мыше ездить за пределы своих форм, а клаву забить хуком.


← →
Novichek ©   (2002-10-11 18:46) [33]

Rouse_ © >> спасибо, только мышь то все равно активная...


← →
Diamond Cat ©   (2002-10-11 23:10) [34]

2 Rouse круто, опознование своего окна через проверку его положения по оси z..... дельный совет

2 Novichek конечно не работает с мышью, ведь ловушка установлена только на клаву. придется сделать и на мышь, исходя из приведенного кода что-то типа

Function MouseHook(Code: Integer; ParamW: WPARAM; ParamL: LPARAM): LRESULT;stdcall;
Begin
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
if TMOUSEHOOKSTRUCT(Pointer(L)^).hwnd=ShareInf^.AppWndHandle then
SendMessage(ShareInf^.AppWndHandle, WM_USER, ParamW, Code)
else exit;
End;
Result := CallNextHookEx(ShareInf^.mouseHookHandle, Code, ParamW, ParamL)
End;




Function SetmousedHook(Wnd: HWND): BOOL; stdcall;
Begin
If ShareInf<>Nil Then
Begin
ShareInf^.AppWndHandle:=Wnd;
ShareInf^.mousehookhandle:=SetWindowsHookEx(WH_mouse, @mouseHook, HInstance, 0);
Result:=ShareInf^.mouseHookHandle<>0;
End
Else Result:=False
End;

надо только добавить к существующей TShareInf еще один параметр типа HHook; т.е.
TShareInf= Record
AppWndHandle: HWND;
mousehookhandle,OldHookHandle: HHOOK;
hm:THandle;
End;
ну и не зыбыть выгрузить ловушку
код не проверял но вроде должен работать

удачи



← →
Novichek ©   (2002-10-13 16:12) [35]

Diamond Cat >
if TMOUSEHOOKSTRUCT(Pointer( L)^).hwnd=ShareInf^.AppWndHandle then

а что эта за переменная L и что с ней делать?


← →
Novichek ©   (2002-10-13 16:29) [36]

а мышь все равно не блокируется ни в моем ни в чужом! можно ли тогда заблокировать мышь полностью(с возможностью разблокировки) и в моем и в чужом приложении, но нетрогая клавиатуру?


← →
Song ©   (2002-10-13 22:26) [37]

L это LParam


← →
Vit@ly   (2002-10-13 23:43) [38]

Опуститесь на землю. Мышь и клавиатура не принадлежат ни программе, ни процессу - это собственность "операциоки". И ИМХО можно закочить дискуссию. Хотя не "авторитет" в последней инстанции.


← →
Novichek ©   (2002-10-14 00:20) [39]

Song > все равно не работает



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.55 MB
Время: 0.013 c
3-82675
AlexeyMir
2002-11-07 13:38
2002.11.25
Удаление записей в Paradox из Delphi


3-82651
Алик
2002-11-03 14:37
2002.11.25
Помогите с запросом


6-82901
boolean
2002-10-01 09:19
2002.11.25
Объясните


3-82623
mas_alexey
2002-11-05 11:00
2002.11.25
Interbase


4-83051
Resheto
2002-09-28 16:09
2002.11.25
Как создать таймер который будет работать и когда комп вырублен




   Наверх