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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.08.2008, 15:21   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Global Hook - движение окон

Приветствую. Я в тупике. Вроде код уже вылезал как только мог. Суть такова. Есть ехе и dll. Ну естественно в dll пихаем хук глобальный на фильтр сообщений после обработки окон. ( Сразу второстипенный вопрос, какие сообщения ловить чтобы знать, что окно изменило размеры или позицию на экране ? ). И вроде все нормально. Но вот не ясно, в примере в данном я ловлю только WM_SIZE но то окно которое обрабатывает сообщения приходящие из dll, если это окно взять за область caption чтобы его перетащить, все нафиг в системе виснет. я уже жесткие ребуты кнопочкой раз 20 делал вот код.. помогите, скажите что не так:

Код:
library winh;

uses
  Windows, Messages;

type
  PData = ^TData;
  TData = packed record
    Hook: HHOOK;
    Wnd: HWND;
  end;

var
  Data: PData;
  H: THandle;
  WM_WNDMOVESIZE: DWORD;

function HookProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
var
  p: PCWPRetStruct;
begin
  if (code < 0) then
  begin
    Result:= CallNextHookEx(Data^.Hook, code, wparam, lparam);
    Exit;
  end;

  if (Data <> NIL) then
  begin
    p := PCWPRetStruct(lparam);
    case p^.message of
      WM_SIZE:
        SendMessage(Data^.Wnd, WM_WNDMOVESIZE, p^.hwnd, 0);
    end;
    CallNextHookEx(Data^.Hook, code, wparam, lparam);
  end;

  Result:= 0;
end;

procedure Hook(State: Boolean; Wnd: HWND); stdcall;
begin
  if State then
  begin
    Data^.Hook := SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, HInstance, 0);
    Data^.Wnd := Wnd;
  end else
  begin
    UnhookWindowsHookEx(Data^.Hook);
  end;      
end;

procedure OpenData;
begin
  WM_WNDMOVESIZE := RegisterWindowMessage('WM_WNDMOVESIZE');

  H := CreateFileMapping(INVALID_HANDLE_VALUE, NIL, PAGE_READWRITE, 0, SizeOf(TData), '_WINH_MAP');
  if (H = 0) then
    Exit;

  Data := MapViewOfFile(H, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TData));
  if (Data = NIL) then
    CloseHandle(H);
end;

procedure CloseData;
begin
  UnmapViewOfFile(Data);
  CloseHandle(H);
end;

procedure DLLEntryPoint(dwReason: DWord);
begin
  case dwReason of
    DLL_PROCESS_ATTACH: OpenData;
    DLL_PROCESS_DETACH: CloseData;
  end;   
end;

exports
  Hook name 'Hook';

begin   
  DLLProc := @DLLEntryPoint;
  DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  protected
    procedure WndProc(var Msg: TMessage); override;
  public
  end;

var
  Form1: TForm1;
  WM_WNDMOVESIZE: DWORD;
  Dll: THandle;
  Hook: procedure(State: Boolean; Wnd: HWND); stdcall;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  WM_WNDMOVESIZE := RegisterWindowMessage('WM_WNDMOVESIZE');
  Hook := NIL;
  Dll := LoadLibrary('winh.dll');
  if (Dll > HINSTANCE_ERROR) then
  begin
    @Hook := GetProcAddress(Dll, 'Hook');
    Hook(True, Handle);
  end;      
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if (Dll > HINSTANCE_ERROR) then
  begin
    Hook(False, 0);
    FreeLibrary(Dll);
  end;
end;

procedure TForm1.WndProc(var Msg: TMessage);
var
  r: trect;
  s: array[0..255] of char;
begin
  inherited;

  if (Msg.Msg = WM_WNDMOVESIZE) then
  begin
    fillchar(s, sizeof(s), 0);
    GetWindowText(Msg.WParam, s, sizeof(s));
    GetWindowRect(Msg.WParam, r);
    Memo1.Lines.Add(Format('%s - %d, %d, %d, %d',
      [s, r.Left, r.Top, r.Right - r.Left, r.Bottom - r.Top]));
  end;
end;

end.
методом исключения и многочисленных ребутов ошибка оказалась в этой строчке
Код:
SendMessage(Data^.Wnd, WM_WNDMOVESIZE, p^.hwnd, 0);
почему..я пока не понимаю

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

Все всем спасибо ) только кипеш поднял. Надо не SendMessage а PostMessage
BOBAH13 вне форума Ответить с цитированием
Старый 15.09.2008, 17:59   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Приветствую всех. Вот развил немного эту длл. И вот не ясное такое дело. Все пашет на ура, НО бывает приложения при закрытии выдают ошибки странные ( когда убераю свою длл, эту, все Ок). Подозрения у меня падают на работу с mappingfile но уверенности нет никакой. Посмотрите длл и ткните меня носом пожалуйста что-то я намудрил 100%
Вложения
Тип файла: rar winh.rar (1.1 Кб, 18 просмотров)
BOBAH13 вне форума Ответить с цитированием
Старый 15.09.2008, 20:58   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Единственное, что нашел:

function HookMouseProc(code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall;
begin
...
Result := CallNextHookEx(Data^.Hook, code, wparam, lparam);
end;

Вместо Data^.HookMouse
alexBlack вне форума Ответить с цитированием
Старый 15.09.2008, 21:06   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Думаю что не из-за этого. наверное характера CreateFileMapping и т.п.... но всеравно спасибо. Даже незнаю в что не так сделал. Может конечно меня глюкануло, но заметил, пока моя прога держит этот хук то виндовс не выключается через меню, т.е. просто жмеш и ничего.
BOBAH13 вне форума Ответить с цитированием
Старый 16.09.2008, 11:59   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Вообщем никто не поможет больше ? может у когонить есть еще какие идеи, почему такое случается ?
BOBAH13 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контроль запускаемых окон(Hook) Alter Win Api 17 24.02.2009 19:59
hook в dll? Altera Win Api 3 09.03.2008 09:54
Hook... Roof Общие вопросы Delphi 5 06.11.2007 16:25
Что делать..:(((много читать)Global problem! Elm0 Свободное общение 24 28.06.2007 18:13
Hook off? Сильванович Михаил Win Api 1 03.04.2007 16:25