Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2008, 00:51   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Стрелка Контроль запускаемых окон(Hook)

Цель программы, вести лог замускаемых программ, и записывать в файл, который будет лежать в той же директории, где и сама DLL.
Ошибки:
1) Почему то несоздаётся лог файл,
2) При попытки выгрузки DLL, выходит Access Violation, (интересно почему).

Использование:
Пока что гружу динамически, вручную.

Как исправить, чтобы заработало?
Вложения
Тип файла: rar Log запуска.rar (232.3 Кб, 33 просмотров)
Alter вне форума Ответить с цитированием
Старый 03.05.2008, 03:34   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Alter, внимательность, внимательность и ещё раз внимательность. !

Код:
var hand : THandle;  // <-------------------- hand !!!!
  Form1: TForm1;
..............................

procedure TForm1.Button1Click(Sender: TObject);
begin //Грузим
  hand := LoadLibrary( Pchar(NamDLL) ); //  <-------------------- hand !!!!
  if hand<>0 then //Если удачно, то идём дальше...
  begin
   @Loads := GetProcAddress(handle,'RunStopHook'); //  // <-------------------- handle !!!! Здесь - TForm1.Handle !!!!!!!!!!
   if @Loads<>nil then
   Loads(True);
    Button1.Enabled := False;
    Button2.Enabled := Not Button1.Enabled;
  end;  
end;
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 17:06   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Немного переделал, но что-то всёравно нетак.
Должно реагировать на создаваемые окна в системе, а результат записывать в файл. Но файл несоздаётся. Может в DLL неправильно считываю информацию, использую WH_CBT хук.
-------------------
Никто несможет помочь наладить?
Может кто-то взглянет, и напишет что не так в DLL.

Пользуйтесь редактированием постов. Не размножайте их.
Вложения
Тип файла: rar Log.rar (6.2 Кб, 40 просмотров)

Последний раз редактировалось B_N; 03.05.2008 в 20:13.
Alter вне форума Ответить с цитированием
Старый 03.05.2008, 19:33   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Для меня странно вот это: ( первое что заметил )
Код:
Buf :Array[0..255] of Char;
а потом вы пишите
Код:
IF Buf<>nil Then
Ну это будет всегда True
Еще уберите Classes ну Lst :TStringList; замените лучше на Lst: TextFile и юзайте ReWrite, WriteLn, CloseFile

Вычитал в совсем неизвестном справочнике MSDN
Цитата:
Value wParam
HCBT_CREATEWND Specifies the handle to the new window.
Значит wParam и есть хендл нового окна. А у меня чет после всех этих исправлений explorer валиться при загрузке вашей dll

Последний раз редактировалось BOBAH13; 03.05.2008 в 19:43.
BOBAH13 вне форума Ответить с цитированием
Старый 03.05.2008, 19:55   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Поидее должно быть так, но при запуске у меня explorer падает и все

Код:
library AppInitDLL;

uses
  Windows, SysUtils, Messages;

{$R *.res}
var
 SysHook :HHook;
 Wnd :Hwnd;
 Buf :Array[0..255] of Char;
 Lst :TextFile;

function SysMsgProc(code :integer; wParam :word;
                    lParam :longint):longint; stdcall;
begin
 if Code = HCBT_CREATEWND then // Если создаётся окно программы
 begin
   Wnd := wParam; // Хендл окна
   GetClassName(Wnd, Buf, SizeOf(Buf)); //Имя класа окна
    Writeln(Format('[%s-%s]%s: Handle=%d', [DateToStr(Date), TimeToStr(Time),
      StrPas(Buf), Wnd]));
 end;
  Result := CallNextHookEx(SysHook, Code, wParam, lParam);
end;

procedure RunStopHook(State : Boolean); stdcall;
begin //Установка, снятие хука
 if State then
 begin
  SysHook := SetWindowsHookEx(WH_CBT, @SysMsgProc, hInstance, 0);
  AssignFile(Lst, ExtractFilePath(ParamStr(0)) + 'Volodya.txt');
  ReWrite(Lst);
 end
  ELSE
 begin
  UnhookWindowsHookEx(SysHook);
  CloseFile(Lst);
 end;
end;

Exports RunStopHook;

begin
end.
BOBAH13 вне форума Ответить с цитированием
Старый 03.05.2008, 20:20   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Alter, хук CBT вызывается в контексте процесса-"жертвы". Как по-Вашему, что будет возвращать при этом ParamStr(0)? Я вот, честно, понятия не имею, что вытворит дельфи в таком случае. Чем меньше в таких вещах всех этих паскальных примочек, тем лучше. И вообще, хуки - это не так просто, как может показаться. Нужно учитывать, в чьём контексте он вызывается, что хук ставится на поток, а не на процесс, что надо организовывать в слабых местах обработку исключений и т.д.
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 20:25   #7
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Сообщение

Пробывал переделанный вариант от ВОВАН13, действительно начинают выключатся окна. 2B_N может предложите свой вариант контроля, чтобы невылетало и запись в файл была как надо. Текстовый файл предложил ВОВАН13, с TStringList вроде невылетало.
Alter вне форума Ответить с цитированием
Старый 03.05.2008, 20:34   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

записывать в файл надо так:
Код:
....
if Code = HCBT_CREATEWND then // Если создаётся окно программы   
 begin   
   Wnd := wParam; // Хендл окна   
   GetClassName(Wnd, Buf, SizeOf(Buf)); //Имя класа окна   
   AssignFile(Lst, ExtractFilePath(ParamStr(0)) + 'Volodya.txt');   
   Append(Lst);
   Writeln(Format('[%s-%s]%s: Handle=%d', [DateToStr(Date), TimeToStr(Time),   
   CloseFile(Lst);  
   StrPas(Buf), Wnd]));   
...
 end;
когда открытие файла присходит в функции RunStopHook, то файл открывается только в твоём процессе.
1. Когда DLL грузится в другой процесс, то надо открывать файл заново, потому что при загрузке в новый процесс в переменной Lst будет ноль или "ерунда".
2. Надо открывать, записывать и закрывать его, потому что когда ты откроешь файл в функции RunStopHook, то никакой другой процесс не сможет открыть его.
rpy3uH вне форума Ответить с цитированием
Старый 03.05.2008, 22:05   #9
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Стрелка

Вот нашол код на Си, может кто-то переведёт его на Delphi. Можно ли этот код приспособить под мою ДЛЛ? Здесь тоже есть перехват создаваемых окон.
Код:
#include <Windows.H>

 //-------------------------------

const char acHooked_WinClassName [] = "??????????",
         char acHooked_WinTitle [] = "?????????";
HINSTANCE hInst;
HHOOK hHook = NULL;


 //======================================================

LRESULT CALLBACK MyHook_CBTProc (
  int nCode,      // hook code
  WPARAM wParam,  // depends on hook code
  LPARAM lParam   // depends on hook code
){

 LRESULT iRes;
 int cxSCREEN, cySCREEN;
 //---------------

  switch (nCode) {

    case HCBT_CREATEWND :

      if (lParam) {
        if (((LPCBT_CREATEWND)lParam)->lpcs) {
         static char acWinClName [512];
         HWND hw = (HWND)wParam;
         //-------------------------------

          if (GetClassName (hw, acWinClName, sizeof (acWinClName) - 1) > 0) {

            if ((lstrcmp (acHooked_WinClassName, acWinClName) == 0) &&
                (lstrcmp (acHooked_WinTitle, ((LPCBT_CREATEWND)lParam)->lpcs->lpszName) == 0)) {
              // Запрещаем окну создаваться:
              // If the hook procedure returns a nonzero value,
              // the system destroys the window;
              // the CreateWindow function returns NULL, but
              // the WM_DESTROY message is not sent to the window.
               return (1);
            };
          };
        };
      };

     // "Вызываем по цепочке"
      iRes =
        CallNextHookEx (
          hHook, // HHOOK hhk,      // handle to current hook
          nCode,      // hook code passed to hook procedure
          wParam,  // value passed to hook procedure
          lParam   // value passed to hook procedure
                 );
      return (iRes);

    default :
     // "Вызываем по цепочке"
      return (
        CallNextHookEx (
          hHook, // HHOOK hhk,      // handle to current hook
          nCode,      // hook code passed to hook procedure
          wParam,  // value passed to hook procedure
          lParam   // value passed to hook procedure
                 )
       );

  };  // switch (nCode)
};  // MyHook_CBTProc

 //======================================================

extern "C"
void __declspec(dllexport) DoHook (void)
{

  if (hHook == NULL) {
    hHook = SetWindowsHookEx (
      WH_CBT, // int idHook,        // hook type
      (HOOKPROC)MyHook_CBTProc, // HOOKPROC lpfn,     // hook procedure
      hInst, // HINSTANCE hMod,    // handle to application instance
      0  // DWORD dwThreadId   // thread identifier
    );
  };  // if (hHook == NULL)

};  // DoHook

 //------------------------------------

extern "C"
void __declspec(dllexport) DoUnHook (void)
{
  if (hHook != NULL) {
    if (UnhookWindowsHookEx (hHook))
      hHook = NULL;
  }
};  // DoUnHook

 //-------------------------------
 //------------------------------------

BOOL WINAPI DllMain (HINSTANCE hInstance,
                     DWORD  Reason, 
                     LPVOID Reserved
                                         )
{

  switch(Reason) {
   //Register messages on creation (not needed but to be safe :))
    case DLL_PROCESS_ATTACH:
      hInst = hInstance;
    return TRUE;

    //When disconnected then detach from the hook
    case DLL_PROCESS_DETACH:
      DoUnHook ();
    return TRUE;
  };  // switch(Reason)
  return TRUE;

};  // DllMain
_________________________________________________________________
Никто несможет разобраться?

Последний раз редактировалось Alter; 04.05.2008 в 19:36.
Alter вне форума Ответить с цитированием
Старый 30.09.2008, 22:14   #10
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Привет. Может кто поможет (хотя уже у меня выработался инстинкт, что тут я ответа не получу ). Какие сообщения надо обрабатывать, в глобальном хуке, и какой хук ставить, чтобы знать что окно изменило размеры, положение, перерисовалось, создало что либо в себе, само создалось, удалилось, свернулось, развернулось и т.п.... собственно все. Мне надо знать что в окне что-то изменилось... а вот как и что именно для этого требуется пока собираю информацию. Спасибо
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Global Hook - движение окон BOBAH13 Общие вопросы Delphi 5 16.09.2008 11:59
IP из заголовка TCP + контроль за портами Majestry Работа с сетью в Delphi 2 28.05.2008 09:54
Контроль перемещения мыши Falling_Tear Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 29.11.2007 19:43
Как получить список запускаемых программ? kozei Win Api 8 01.11.2007 16:07