Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];

Вниз

Клава и 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.011 c
11-74108
Wm
2003-02-07 18:16
2003.10.23
BitBtn и XPманифест


3-74034
Little_user
2003-10-03 09:46
2003.10.23
D5 ADO Dbf


3-74066
BD & Images
2003-10-06 07:04
2003.10.23
Как в таблицу вставить картинку ?


1-74258
Lam
2003-10-13 10:08
2003.10.23
ini файл


1-74150
saska
2003-10-10 14:40
2003.10.23
GUID





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский