Форум: "Основная";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];
ВнизРабота модуля блокировки клавы и мыши. Есть вопросы... Найти похожие ветки
← →
VID (2002-06-04 20:26) [0]Приветствую!
Для начала - код юнита:
{
Модуль mklu. Mouse and Keyboard Lock/Unlock
(c) 2002. Автор модуля VID. vidsnap@mail.ru
Модуль предназначен для осуществления частичной блокировки/разблокировки функций клавиатуры и мышки.
Procedure KeyBoardOn - разблокировка (включение) клавиатуры
Procedure KeyBoardOff - блокировка (выключение) клавиатуры
Procedure MouseOn - разблокировка (включение) мышки
Procedure MouseOff - блокировка (выключение) мышки
}
unit mklu;
interface
uses
Windows;
Var
m_Dummy: integer = 0;
m_OldKbHook:HHook = 0;
k_Dummy:Integer = 0;
k_OldKBHook:HHook = 0;
function KbHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt;stdcall;
procedure KeyBoardOn;
procedure KeyBoardOff;
function MouseHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt;stdcall;
procedure MOUSEON;
procedure MouseOff;
implementation
function KbHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt;stdcall;
begin
if code<0 then Result:=CallNextHookEx( k_oldKbHook, code, wparam, lparam )
else Result:=1;
end;
// включение клавы
procedure KeyBoardOn;
begin
if k_OldKbHook <> 0 then
begin
UnHookWindowshookEx( k_OldKbHook );
k_OldKbHook := 0;
end;
SystemParametersInfo( SPI_SETFASTTASKSWITCH, 0, 0, 0);
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, 0, 0);
end;
// выключение клавы
procedure KeyBoardOff;
begin
SystemParametersInfo( SPI_SETFASTTASKSWITCH, 1, @k_Dummy, 0);
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @k_Dummy, 0);
k_OldKbHook := SetWindowsHookEx( WH_KEYBOARD, @KbHook, HInstance, 0 );
end;
function MouseHook( code: Integer; wparam: Word; lparam: LongInt ): LongInt;stdcall;
begin
if code<0 then Result:=CallNextHookEx( m_oldKbHook, code, wparam, lparam )
else Result:=1;
end;
// включение мышки
procedure MOUSEON;
begin
if m_OldKbHook <> 0 then
begin
UnHookWindowshookEx( m_OldKbHook );
m_OldKbHook := 0;
end;
SystemParametersInfo( SPI_SETFASTTASKSWITCH, 0, 0, 0);
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 0, 0, 0);
end;
// выключение мышки
procedure MouseOff;
begin
SystemParametersInfo( SPI_SETFASTTASKSWITCH, 1, @m_Dummy, 0);
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, @m_Dummy, 0);
m_OldKbHook := SetWindowsHookEx( WH_MOUSE, @MOUSEHook, HInstance, 0 );
end;
end.
Этот код можно найти в UBPFD.
Ситуация: Есть прога, которая блокирует и разблокирует (в зависимости от нажатой кнопки на форме) клаву, с помощью приведённых выше функций KeyboardOFF и KeyboardOn.
Запускаю две копии (А и Б) этой проги. В копии А нажимаю кнопку блокировки клавы. Всё клава заблокирована. Теперь в копии Б, мышкой (а как же ещё ? :) ) щёлкаю на кнопку разблокировки клавы (UNLOCK). Но клава нифига не хочет разблокироваться. Клавиатура разблокируется, только при нажатии кнопки "UNLOCK" в копии А. Понятное дело, что такая ситуация вытекает из самого кода описанного выше юнита.
ВОПРОС: Как можно/нужно модифицировать код юнита mklu, что бы, описанная ситуация не возникала, т.е. что бы заблокировав клаву из копии А, её можно было спокойно разблокировать из копии Б ?
← →
dobriy (2002-06-04 21:31) [1]К сожалению скорее всего этого не сделать. Подробнее читай статью о реализации Hook-ов на www.sources.ru.
← →
VID (2002-06-04 22:00) [2]Блин, вот облом...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c