Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа модуля блокировки клавы и мыши. Есть вопросы... [D5, Win2k]


VID ©   (2002-06-04 20:26:00) 

Приветствую!
Для начала - код юнита:
{
Модуль 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, что бы, описанная ситуация не возникала, т.е. что бы заблокировав клаву из копии А, её можно было спокойно разблокировать из копии Б ?


VID   (2002-06-04 22:00:00) [1]

Блин, вот облом...


dobriy   (2002-06-04 21:31:00) [2]

К сожалению скорее всего этого не сделать. Подробнее читай статью о реализации Hook-ов на www.sources.ru.


Наверх

Титульная страница Поиск, карта сайта Написать письмо