Программирование >>  Автоматически обновляемые приложения 

1 ... 85 86 87 [ 88 ] 89 90 91 ... 170


Листинг 8.16. Включение индикаторов на клавиатуре

using System.Runtime.InteropServices; [Dlllmport( user32.dll )]

static extern void keybd event(byte bVk, byte bScan, uint dwFlags, UlntPtr dwExtralnfo);

private const int VK NUMLOCK = 0x90;

private const int VK SCROLL = 0x91;

private const int VK CAPITAL = 0x14;

private const int KEYEVENTF EXTENDEDKEY = 0x1;

private const int KEYEVENTF KEYUP = 0x2;

private void butCapsLock Click(object sender, EventArgs e) {

Включаем индикатор Caps Lock

keybd event(VK CAPITAL, 0x45, KEYEVENTF EXTENDEDKEY, (UlntPtr)0), keybd event(VK CAPITAL, 0x45,

KEYEVENTF EXTENDEDKEY KEYEVENTF KEYUP, (UlntPtr)0) ,

private void butNuinLock Click (object sender, EventArgs e) {

Включаем или выключаем индикатор Num Lock

keybd event(VK NUMLOCK, 0x45, KEYEVENTF EXTENDEDKEY, (UlntPtr)0), keybd event(VK NUMLOCK, 0x45,

KEYEVENTF EXTENDEDKEY KEYEVENTF KEYUP, (UlntPtr)O),

<Num Lock> и <Scroll Lock>. Например, если горит индикатор Caps Lock, значит, клавиша <Caps Lock> активирована, и все символы, вводимые в текстовом поле, будут выводиться в верхнем регистре (если при этом удерживать клавишу <Shift>, то символы будут выводиться в нижнем регистре). Мы можем программно изменить состояние этих клавиш и устроить небольшую светомузыку, включая и выключая индикаторы в такт какой-нибудь мелодии. Для реализации этой идеи нам понадобится вызов функций Windows API keybdevent, как показано в листинге 8.16.



Как определить состояние клавиш-индикаторов?

у вас может возникнуть вопрос, а как узнать текущее состояние этих клавиш-индикаторов перед их включением или выключением. В .NET Framework 1.1 приходилось использовать неуправляемый код (листинг 8.17).

Листинг 8.17. Состояние клавиш-индикаторов через неуправляемый код

[Dlllmport( user32 )]

public static extern int GetKeyboardState(byte[] pbKeyState);

private void butStatus Click(object sender, EventArgs e) {

bool CapsLockState;

byte[] keyState = new byte[256];

GetKeyboardState(keyState) ;

CapsLockState = Convert.ToBoolean(keyState[VK CAPITAL]);

if (CapsLockState)

IblCapsLock.Text = Caps Lock: Вкл ;

else

IblCapsLock.Text = Caps Lock: Выкл ;

С помощью данного кода можно было узнать состояние клавиши <Caps Lock>. Но с появлением .NET Framework 2.0 задача упростилась. В классе Control

11 Вютючаем или выютючаем индикатор Scroll Lock

keybd event(VK SCROLL, 0x45, KEYEVENTF EXTENDEDKEY, (UlntPtr)0); keybd event(VK SCROLL, 0x45,

KEYEVENTF EXTENDEDKEY KEYEVENTF KEYUP, (UlntPtr)0);

Как видите, для включения какой-нибудь клавиши с индикатором нужно дважды вызвать функцию keybdevent. Повторный двойной вызов этой функции выключает индикатор, поэтому нет необходимости писать какой-либо дополнительный код для этого.



; Листинг 8.18. Определение состояния клавиш-индикаторов с помощью I управляемого кода

Получаем текущее состояние клавиши Caps Lock

IblCapsLock.Text = Control.IsKeyLocked(Keys.CapsLock).ToString();

Примечание

Пример, иллюстрирующий работу с клавишами-индикаторами, находится в папке CapsLock на прилагаемом диске.

Последнее нажатие на клавишу или на кнопку мыши

Наверное, вы замечали, что ICQ и ей подобные программы могут определять активность пользователя. Если пользователь в течение определенного времени не прикасался к клавишам клавиатуры или не трогал мышь, то значок программы меняется на состояние Отошел. И его собеседник, видя это состояние, уже не будет понапрасну посылать сообщения. Для реализации этой задачи очень удобно использовать функцию Windows API GetLastinputinfo, которая возвращает время, прошедшее с последнего нажатия на клавиатуру или мышь. Разместим на форме кнопку и таймер. Все свойства элементов будут определены программно, поэтому оставляем все значения свойств по умолчанию (листинг 8.19).

I Листинг 8.19. Определение времени с момента последнего нажатия клавиши \ клавиатуры или движения мышью

struct LASTINPUTINFO {

public int cbSize; public int dwTime;

[Dlllmport( user32.dll )]

static extern bool GetLastinputinfo(ref LASTINPUTINFO plii)

появился новый метод isKeyLocked, который определяет состояние трех клавиш <Caps Lock>, <Num Lock> и <Scroll Lock>. Работа с ним проиллюстрирована в листинге 8.18.



1 ... 85 86 87 [ 88 ] 89 90 91 ... 170

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика