Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

блокирока мыши и клавы в чужом приложении не трогая своё [D6]


Страницы:   1 2

Novichek ©   (2002-10-10 02:19:00) 

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


Novichek   (2002-10-10 06:44:00) [21]

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


Rouse_   (2002-10-10 06:40:00) [22]


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

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

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


Novichek   (2002-10-10 06:29:00) [23]

да, в принципе стандартный пример, взятый здесь же:
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:14:00) [24]

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

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


Novichek   (2002-10-10 06:12:00) [25]

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


Rouse_   (2002-10-10 06:07:00) [26]

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

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


Novichek   (2002-10-10 06:03:00) [27]

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


Rouse_   (2002-10-10 05:59:00) [28]

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

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


Novichek   (2002-10-10 05:53:00) [29]

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


rhf   (2002-10-10 04:58:00) [30]

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


Rouse_   (2002-10-10 04:52:00) [31]

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

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


Novichek   (2002-10-10 04:46:00) [32]

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


Rouse_   (2002-10-10 04:08:00) [33]

GetForegroundWindow

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

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


Novichek   (2002-10-10 03:51:00) [34]

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


Rouse_   (2002-10-10 03:28:00) [35]

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

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


Novichek   (2002-10-10 03:23:00) [36]

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


rhf   (2002-10-10 02:49:00) [37]

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 02:36:00) [38]

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


Rouse_   (2002-10-10 02:31:00) [39]

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

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо