Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-82887
TDOP
2002-09-28 22:10
2002.11.25
Как узнать все IP адреса ?


1-82699
serz
2002-11-14 16:13
2002.11.25
help


1-82739
Zike
2002-11-15 11:01
2002.11.25
Получение нескольких Результатов функции


1-82729
sen
2002-11-15 08:52
2002.11.25
Узнать, какая русская буква нажата


6-82907
Chlavik
2002-09-26 02:26
2002.11.25
Сохранение масива..............





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский