Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.23;
Скачать: CL | DM;

Вниз

Клава и WH_KEYBOARD_LL   Найти похожие ветки 

 
DeadMeat ©   (2003-08-01 17:02) [0]

Доброе время всем. У меня возникла такая проблема:
надо заблокировать все клавиши кроме какой-нибудь одной (или больше). Под Win9x это делается элементарно, а вот под Win2k/xp уже не получилось. Ставлю WH_KEYBOARD_LL и всё как-бы хорошо, если надо заблокировать все клавиши, а вот оставить среди них одну не выходит. Смотрел у Рихтера, перевёл на Delphi и ни фига. Кто знает просьба помочь.


 
AlexRush ©   (2003-08-01 17:24) [1]

KeyboardProc
.......
Return Values
To prevent Windows from passing the message to the rest of the hook chain or to the target window procedure, the return value must be a nonzero value. To allow Windows to pass the message to the target window procedure, bypassing the remaining procedures in the chain, the return value must be zero.

пример:


function KeyboardProc(code:integer;key,strokeflag:DWORD):LRESULT;stdcall;
begin
...
case key of
VK_A : result:=0;// разрешить
VK_B : result:=1;// запретить
end;
...
end;



 
DeadMeat ©   (2003-08-02 13:47) [2]

Справка это конечно-же хорошо, но всё это прекрасно работало у меня только в Win9x, а в Winxp уже нет, он не передаёт в wparam код клавиши. В примере Рихтера wparam использовался для определения факта нажатия системных клавиш, а lparam указывал на структуру, в которой хранятся коды нажатых клавиш... Проблема в том, что у меня щас под рукой нет C++ и проверить работоспособность под Winxp я не могу. Вот сам код:

#define _WIN32_WINNT 0x0400
#include <Windows.h>
LRESULT CALLBACK LowLevelKeyboardProc(int nCode,
WPARAM wParam, LPARAM lParam) {
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN: case WM_SYSKEYDOWN:
case WM_KEYUP: case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
((p->vkCode == VK_TAB) && ((p->flags & LLKHF_ALTDOWN) != 0)) ||
((p->vkCode == VK_ESCAPE) &&
((p->flags & LLKHF_ALTDOWN) != 0)) ||
((p->vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) &
0x8000) != 0));
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam,
lParam));
}
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc, hinstExe, 0);
MessageBox(NULL,
TEXT("Alt+Esc, Ctrl+Esc, and Alt+Tab are now disabled.\n")
TEXT("Click \"Ok\" to terminate this application and re-enable
these keys."),
TEXT("Disable Low-Level Keys"), MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
return(0);
}


Он из MSDN, здесь блокируются системные клавиши.
Может я где ошибся...?? Помогите...!!


 
DeadMeat ©   (2003-08-04 17:09) [3]

Неужто никто с этим не сталкивался...??!


 
AlexRush ©   (2003-08-04 17:28) [4]

Код DLL (hooks.dll):

library hooks;


USES Windows;

function KeyboardProc(iCode:integer;
key,
stroke:DWORD):LRESULT;stdcall;export;
begin
case key of
VK_RETURN : result:=0;
{.....}
else result:=1;
end;
end;

EXPORTS KeyboardProc;

begin

end.


Код тест-программы:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
hLib:DWORD;
hHook:DWORD;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ptrProc:pointer;
begin
hLib:=LoadLibraryA("hooks.dll");
ptrProc:=GetProcAddress(hLib,"KeyboardProc"#0);
hHook:= SetWindowsHookExA(WH_KEYBOARD,
ptrProc,
hLib,
0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnhookWindowsHookEx(hHook);
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13
( "[Enter]")
Код DLL (hooks.dll):

library hooks;


USES Windows;

function KeyboardProc(iCode:integer;
key,
stroke:DWORD):LRESULT;stdcall;export;
begin
case key of
VK_RETURN : result:=0;
{.....}
else result:=1;
end;
end;

EXPORTS KeyboardProc;

begin

end.


Код тест-программы:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
hLib:DWORD;
hHook:DWORD;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ptrProc:pointer;
begin
hLib:=LoadLibraryA("hooks.dll");
ptrProc:=GetProcAddress(hLib,"KeyboardProc"#0);
hHook:= SetWindowsHookExA(WH_KEYBOARD,
ptrProc,
hLib,
0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnhookWindowsHookEx(hHook);
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13
then ShowMessage("[Enter]");
end;

end.


Что здесь неясно ? (пиши на аську)


 
DeadMeat ©   (2003-08-05 15:23) [5]

Здесь всё было ясно мне уже давно... Но прошу обратить внимание на текст моего вопроса... Дело в том, что всё это работает при WH_KEYBOARD, но при WH_KEYBOARD_LL уже нет..., в этом и всё проблема. У тебя же используется WH_KEYBOARD. Виноват, если не так сформулировал вопрос...


 
AlexRush ©   (2003-08-06 11:17) [6]

Это я вопроса не понял сразу....
Мне с LL работать как-то не приходилось.Самое забавное:
MSDN>
Requirements
Windows NT/2000: Requires Windows NT 4.0 SP3 or later.
Windows 95/98: Unsupported.
Header: Declared in Winuser.h; include Windows.h.

..интересно, как у тебя получилось...

Вот переделал примерчик:

library hooks;


USES Windows,Messages;

TYPE
KBDLLHOOKSTRUCT = packed record
vkCode :DWORD;
scanCode :DWORD;
flags :DWORD;
time :DWORD;
dwExtraInfo :POINTER;
end;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;

function LowLevelKeyboardProc(iCode:integer;
WM_id:DWORD;
pSt:PKBDLLHOOKSTRUCT):LRESULT;stdcall;export;
begin
{....}
case pSt^.vkCode of
VK_RETURN : result:=0;
{.....}
else result:=1;
end;
{....}
end;


EXPORTS LowLevelKeyboardProc;

begin

end.

============================

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
hLib:DWORD;
hHook:DWORD;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ptrProc:pointer;
begin
hLib:=LoadLibraryA("hooks.dll");
ptrProc:=GetProcAddress(hLib,"LowLevelKeyboardProc"#0);
hHook:= SetWindowsHookExA(13{WH_KEYBOARD_LL},
ptrProc,
hLib,
0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnhookWindowsHookEx(hHook);
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13
then ShowMessage("[Enter]");
end;

end.


Под моей Win2kPro/SP3 всё замечательно работает.

И еще обрати внимание:
The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:

HKEY_CURRENT_USER\Control Panel\Desktop

The value is in milliseconds. If the hook procedure does not return during this interval, the system will pass the message to the next hook.


 
DeadMeat ©   (2003-08-06 15:07) [7]

> ..интересно, как у тебя получилось...
У меня это никак не получилось, в win98 я использовал нечто вроде того, что ты предлагал в начале, а в win2k/xp пытался применить нечто похожее, но с WH_KEYBOARD_LL, и ничего не вышло, т.к. с C++ у меня не очень-то, и пример переделать я не смог.
А за помощь спасибо, долго я мучился...



Страницы: 1 вся ветка

Текущий архив: 2003.10.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
1-74197
TUser
2003-10-10 09:40
2003.10.23
Time


4-74541
Michael Makushev
2003-08-18 13:30
2003.10.23
TThread - и совместное использование данных


7-74513
Supra
2003-08-05 03:44
2003.10.23
Как просканирвать шину PCI?


1-74224
Andriy Tysh
2003-10-09 14:51
2003.10.23
TToolButton, tbsDropDown


3-73965
Дмитрий К.
2003-10-05 01:29
2003.10.23
Коректное обновление данных базы в сети.