Приколы с помощью Delphi. Незакрывающиеся окна и клавиатура :
Автор: Артём Сухобоков chimaf@mail.ru или artem2@beep.ru
Рис. 1 Общие приколы.
Мне сказали, что не все приколы работают в Win2k, поэтому в программах и статьях я буду писать, что где работает. Вернемся к предыдущей статье "Приколы c помощью Delphi: Общие приколы":
1) Невидимка работает только в Win9x;
2) Отключение комбинаций клавиш Ctrl-Alt-Del, Alt-Tab, Ctrl-Esc работает только в Win9x;
3) Изменение надписи на окнах открытых приложений работает в Win9x и Win2k;
Итак, что у нас на сегодня?
1) Окно, которое не возможно закрыть штатными средствами Windows.
(работает только в Win9x)
Для этого нужно вызвать функцию DeleteMenu:
BOOL DeleteMenu(
HMENU hMenu, // хэндл меню
UINT uPosition, // позиция или элемент меню для удаления
UINT uFlags // флаг элемента. От него зависит смысл параметра uPosition
);
uFlags может принимать одно из следующих значений:
MF_BYCOMMAND показывает, что uPosition указывает на элемент меню
MF_BYPOSITION показывает, что uPosition - относительная позиция элемента меню, отсчитываемая от 0.
DeleteMenu возвращает ненулевое число, если завершается успешно. В случае ошибки она возвращает 0. Чтобы узнать информацию об ошибке нужно вызвать функцию GetLastError.
Пишем программу. Создаем форму Form2. В событии OnCreate Form2 пишем:
procedure TForm2.FormCreate(Sender: TObject);
Var MenuHandle:HMENU; //хэндл системного меню
begin
if Form1.Button1.Enabled=true then
Form1.Button1.Click; //Убираем приложение из списка
//Ctrl-Alt-Del (смотри предыдущую статью)
MenuHandle:=GetSystemMenu(Handle,False); //Получаем хэндл системного меню
if MenuHandle<>0 then
//удаляем из меню команду закрытия
DeleteMenu(MenuHandle,SC_CLOSE,MF_BYCOMMAND);
end;
Приколы с клавиатурой.
2) Программно нажимаем на Num Lock, Caps Lock и Scroll Lock
(работает только в Win9x)
//Программно нажимаем на Num Lock
procedure TForm1.Button7Click(Sender: TObject);
Var KeyboardState: TKeyboardState; //состояние клавиатуры-массив
begin
GetKeyboardState(KeyboardState); //получвем состояние клавиатуры
//изменяем состояние клавиши с номером 144
KeyboardState[144]:=KeyboardState[144] xor 1;
SetKeyboardState(KeyboardState); //устанавливаем новое состояние клавиатуры
end;
Рис. 2 Приколы с клавиатурой.
Чтобы изменить состояние клавиши Caps Lock и Scroll Lock нужно в предыдущей процедуре изменить только одну строчку:
Для Caps Lock:
//изменяем состояние клавиши с
номером 20
KeyboardState[020]:=
KeyboardState[020] xor 1;
Для Scroll Lock:
//изменяем состояние клавиши с
номером 145
KeyboardState[145]:=
KeyboardState[145] xor 1;
3) Цветомузыка на клавиатуре
(работает только в Win9x)
Помещаем на форму таймер и в его событии OnTimer пишем:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
// Нажимаем на Num Lock, Caps Lock и Scroll Lock
Button7.Click;
Button8.Click;
Button9.Click;
end;
Пишем процедуры включения и выключения цветомузыки:
// Включение цветомузыки
procedure TForm1.Button10Click(Sender: TObject);
begin
GetKeyboardState(OldKeyboardState); //сохраняем состояние клавиатуры
//Разрешаем/запрещаем кнопки
Button11.Enabled:=true;
Button10.Enabled:=false;
Timer1.Enabled:=true; //запускаем таймер
end;
// Выключение цветомузыки
procedure TForm1.Button11Click(Sender: TObject);
begin
Timer1.Enabled:=false; //останавливаем таймер
//Разрешаем/запрещаем кнопки
Button11.Enabled:=false;
Button10.Enabled:=true;
SetKeyboardState(OldKeyboardState); //восстанавливаем состояние клавиатуры
end;
Еще в начале модуля Unit1 нужно описать переменную OldKeyboardState:
...
Var OldKeyboardState: TKeyboardState;
...
4) Установка русской/английской раскладки клавиатуры
(работает в Win9x и Win2k)
Установка раскладки клавиатуры производится с помощью функции
HKL LoadKeyboardLayout(
LPCTSTR pwszKLID, // название раскладки для загрузки
UINT Flags // флаги
);
Из флагов нас интересует только KLF_ACTIVATE, который загружает указанную раскладку и активирует ее. Если раскладка уже загружена, то происходит только ее активация.
Если функция выполняется успешно, то она возвращает хэндл раскладки клавиатуры, в противном случае NULL.
Все. В следующий раз я расскажу о том, что можно сделать с CD-ROMом и монитором.