Delno blokiranje tipkovnice

Vsi vaši problemi s programsko opremo.
vragec
Prispevkov: 15
Pridružen: 09.03.2003 13:51:00

Delno blokiranje tipkovnice

Odgovor Napisal/-a vragec » 20.01.2007 17:03:45

Že kar vidim odgovor: POGLEJ PO FORUMU, O TEM SMO ŽE PISALI...
Res ste pisali o tem, a nič od napisanega ne morem uporabiti. Potrebujem kodo, ki onemogoči sistemske tipke (ctrl, alt, F1 - F12, delete,... [za cel sistem]), in ob tem še vse ostale [delujejo samo samo v mojem programu]. Naj odgovor ne bo le "napisat moraš hook", ker se mi niti približno ne sanja, kaj naj vanj napišem...
program naj vse tipke povrne v normalno stanje.

Pa še to! Prosim, da mi ne pišete povezav do demo programov, knjižnic,...

Že v naprej hvala za pomoč.



vragec

vragec
Prispevkov: 15
Pridružen: 09.03.2003 13:51:00

Delno blokiranje tipkovnice

Odgovor Napisal/-a vragec » 20.01.2007 17:06:54

program naj vse tipke povrne v normalno stanje.
Da ne bo pomote...
Program naj tipke povrne v normalno stanje ob izhodu.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Delno blokiranje tipkovnice

Odgovor Napisal/-a Runner » 20.01.2007 17:13:08

Napisati moraš hook :D To ti pač ne uide.

Za kaj bolj resnega lahko napišeš keyboard filter driver. Lep primer je imel svoj čas Russinovich na SysInternals strani. Drugače pa ti prilagam en tak globalni hook ki sem ga nekoč davno tega nekje celo uporabljal.

Koda: Izberi vse

  
library KeyHook;

uses
  Windows,
  Messages,
  sysutils;

const
  WH_KEYBOARD_LL = 13;

type
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
  KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: Longword;
  end;

type
 THookRec = record
   hMSNHook: HHOOK;
   hMSNWnd: DWORD;
   oldProc: Integer;
 end;

var
 map: DWord;
 buf: ^THookRec;


// removes hook
function RemoveHook: Boolean; stdcall; export;
begin
 Result := false;
 if (assigned(buf)) then
 begin
    if (buf^.hMSNHook <> 0) then UnhookWindowsHookEx(buf^.hMSNHook);
    buf^.hMSNHook := 0;
    UnmapViewOfFile(buf);
    buf := nil;
    Result := true;
 end;
end;

function PROC(nCode: Integer; wp: wParam; lp: lParam): LongInt; stdcall;
var
  hooked: KBDLLHOOKSTRUCT;
begin
  if (nCode >= HC_ACTION) then
  begin
    hooked := PKBDLLHOOKSTRUCT(lp)^;
    if hooked.vkCode = VK_ESCAPE then
    begin
      Result := CallNextHookEx(buf^.hMSNHook, nCode, wp, lp);
      RemoveHook;
    end
    else
      Result := 1;
  end
  else 
    Result := CallNextHookEx(buf^.hMSNHook, nCode, wp, lp);
end;

// sets up hook
function SetHook(HookHandle : DWORD): Boolean; stdcall; export;
begin
 try
   Result := false;
   if (not assigned(buf)) then
   begin
     map := CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(THookRec), 'KeyRecMemBlock');
     buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
     buf^.hMSNWnd:=HookHandle;
     buf^.hMSNHook := SetWindowsHookEx(WH_KEYBOARD_LL , @Proc, hInstance, 0);
     Result := true;
   end;
 except
   Result := false;
   MessageBox(0, 'error in SetHook', 'error', MB_OK);
 end;
end;

// DLL entry point
procedure DllEntry(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH:
    begin
      if (not assigned(buf)) then
      begin
        map := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, 'KeyRecMemBlock');
        buf := MapViewOfFile(map, FILE_MAP_ALL_ACCESS, 0, 0, 0);
        CloseHandle(map);
        map := 0;
      end;
    end;
    DLL_PROCESS_DETACH:
    begin
      UnmapViewOfFile(buf);
      buf := nil;
    end;
  end;
end;

exports
  SetHook,
  RemoveHook;

// main
begin
 DisableThreadLibraryCalls(hInstance);
 DllProc := @DLLEntry;
 DllEntry(DLL_PROCESS_ATTACH);
end.
V prvotno stanje povrneš vse skupaj enostavno tako da na koncu kličeš RemoveHook. Kaj boš pa s tipkami počel je pa prepuščeno tvoji domišliji :)

BTW: CTRL+ALT+DEL s tem ne boš mogel prestrezati.
Zadnjič spremenil Runner, dne 20.01.2007 17:14:53, skupaj popravljeno 1 krat.

Uporabniški avatar
JernejL
Prispevkov: 1292
Pridružen: 17.11.2001 10:14:23
Kontakt:

Delno blokiranje tipkovnice

Odgovor Napisal/-a JernejL » 20.01.2007 17:55:39

ctrl alt del lahko prestrezaš recimo na winxp mašinah kjer to požene task manager, s tem da v registru pod
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options

dodaš za taskmgr.exe ključ z vrednostjo "Debugger" kjer je vrednost ime recimo praznega programa ki bi rad da se zažene namesto task managerja, s tem onesposobiš ctrl+alt+del, razen če ni sistem konfiguiran da pri ctrl+alt+del prikaže system security dialog.
Igre in Delphi - WIP projekt, ki traja že od leta 2003. [url]http://mathpudding.com/[/url]

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Delno blokiranje tipkovnice

Odgovor Napisal/-a Runner » 20.01.2007 18:07:08

Ah, CTRL + ALT + DEL lahko prestrežeš na veliko načinov :

1. Subclassing security okna ki ga prikažeta GINA in Winlogon
2. GINA stub
3. GINA hook (Meni najljubša opcija). Z recimo madCodeHook hookaš MsGina.dll in prestrezaš omenjeno kombinacijo. btw - GINE v Visti ni več.
4. keyborad filter driver

pa še kaj bi se našlo.

Tisto kar si napisal deluje, ampak zakaj bi to počel, če imaš v registru tudi opcijo DisableTaskManager ali nekaj podobnega ki je namenjena prav temu. Jaz sicer packanja po registru ne maram, ker se potem zgodi da ob uninstalu tisto tudi ostane tam (sploh kar je pod HKEY_CURRENT_USER).

vragec
Prispevkov: 15
Pridružen: 09.03.2003 13:51:00

Delno blokiranje tipkovnice

Odgovor Napisal/-a vragec » 20.01.2007 20:19:07

a ima kdo kako idejo kako prestrezeš ctrl + alt + delete?
Zadnjič spremenil vragec, dne 20.01.2007 20:22:08, skupaj popravljeno 1 krat.

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

Delno blokiranje tipkovnice

Odgovor Napisal/-a Runner » 20.01.2007 20:28:20

Saj sem ti ravnokar napisal kako.

Lahko objavim tudi primere kode, če te to tako zanima. Ampak vprašaj se če se ti splača s tem mučit ker ni ravno najlažja tema.

Evo na hitro kar sem našel na netu.

Koda: Izberi vse

// Put this code in your forms oncreate or on activate event.

procedure Tform1.FormCreate(Sender: TObject);
var
Reg: TRegistry;
begin

  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\System',
True)
    then Reg.WriteInteger('DisableTaskMgr',1);
  finally
    Reg.CloseKey;
    Reg.Free;
  end;
end;


// Remember to restore the systems state to mormal after exit. put this code
// in your forms ondestroy event

procedure Tcontrolform.FormDestroy(Sender: TObject);
var
Reg: TRegistry;
begin

  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CURRENT_USER;
    if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Policies\System',
True)
    then Reg.WriteInteger('DisableTaskMgr',0);
  finally
    Reg.CloseKey;
    Reg.Free;
  end;
end; 
Ampak če se ti program usuje, bo TM ostal disabled. Skratka jaz tega packanja po registru ne maram videti. Ker na koncu potem register vedno izgleda kot novoletna jelka.

Vsi drugi omenjeni pristopi so veliko zahtevnejši. Če te vseeno zanima pa povej :)
Zadnjič spremenil Runner, dne 20.01.2007 20:28:58, skupaj popravljeno 1 krat.

vragec
Prispevkov: 15
Pridružen: 09.03.2003 13:51:00

Delno blokiranje tipkovnice

Odgovor Napisal/-a vragec » 20.01.2007 20:40:25

sorry sm spregledu, kr se pa tiče tega, da TM ostane onemogočen ko se sistem sesuje, je dobr, ker s programom ki ga delam hočem doseči ravno to, da je dostop do sistema čim težji, vedno pa obstaja fizična tipka za restartanje.

tnx za kode. Ko jih bom preizkusil, bom povedal, če hočem še bolj zakomplicirati.

vragec
Prispevkov: 15
Pridružen: 09.03.2003 13:51:00

Delno blokiranje tipkovnice

Odgovor Napisal/-a vragec » 21.01.2007 09:41:39

upam da mi ne bo kdo zameru (v šoli nas učijo C#): Kako pa kličem hook, oz. funkcije iz hook-a?

vragec
Prispevkov: 15
Pridružen: 09.03.2003 13:51:00

Delno blokiranje tipkovnice

Odgovor Napisal/-a vragec » 21.01.2007 09:59:17

Pa še t:

Pri kodi ki naj bi onesposobila TM, mi javi napako :
[Error] Unit1.pas(27): Undeclared identifier: 'TRegistry'

A moram vključit kako dodatno knjižnico?

Odgovori