Форум: "WinAPI";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Внизблокирока мыши и клавы в чужом приложении не трогая своё Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.01 c