Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук слишком сильно загружает процессор, прослушивание клавы 
V
    Опции темы
barin_Student
Дата 28.11.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Код

//--------------------------
#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 висела в памяти
}

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


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
Lazin
Дата 28.11.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



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

держать файл открытым постоянно, не открывать-закрывать его при каждом нажатии на кнопку клавиатуры
PM MAIL Skype GTalk   Вверх
barin_Student
Дата 28.11.2008, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



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


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
Lazin
Дата 28.11.2008, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



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

PM MAIL Skype GTalk   Вверх
barin_Student
Дата 28.11.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



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


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
Lazin
Дата 28.11.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



ну так этот цикл и грузит проц

Добавлено через 37 секунд
вставь туда Sleep(-1) вместо цикла
PM MAIL Skype GTalk   Вверх
deniska
Дата 28.11.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Цитата

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

Цитата

while(1) {};

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

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

Это сообщение отредактировал(а) deniska - 28.11.2008, 12:10
PM MAIL ICQ   Вверх
barin_Student
Дата 28.11.2008, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



Пробую.... smile 



--------------------
Нехорошо блин!!!
PM MAIL   Вверх
xvr
Дата 28.11.2008, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Кстати, кроме 100% загрузки проца из за while(1) {} твой хук (с многочисленными манипуляциями с файлами и Sleep(150) внутри) превратит твой комп в пищущую машинку (я имею в виду скорость работы)  smile 
PM MAIL   Вверх
barin_Student
Дата 28.11.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 488
Регистрация: 10.8.2007
Где: Казахстан , Алмат ы

Репутация: нет
Всего: 2



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


--------------------
Нехорошо блин!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.