Форум: "Система";
Текущий архив: 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.48 MB
Время: 0.01 c