Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отловить сообщение контрола, зная только Handle 
:(
    Опции темы
DriveSoftware
  Дата 24.1.2004, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как отловить сообщение контрола о изменении его размера, который расположен не на свое форме ?

Вообщем это нужно отловить от системного трея.
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 24.1.2004, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Ставь хук на WH_GETMESSAGE и там мониторь сообщение WM_SIZE, как только будет меняться контрол с твоим Handle, значит ты отловил его))


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
DriveSoftware
Дата 24.1.2004, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



<Spawn>

Если не сложно, дай примерчик пожалуйста smile.gif
PM MAIL WWW ICQ   Вверх
<Spawn>
Дата 24.1.2004, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

Репутация: 44
Всего: 64



Не сложно smile.gif Только не WH_GETMESSAGE, а WH_CBT тут нужно:

Создаешь новую ДЛЛ:

Код
library Hook;

uses
 Windows,
 UHook in 'UHook.pas';

{$R *.res}    

exports
 SetHook,
 FreeHook;

begin
end.


К ней добавляешь юнит и дополняешь его этим кодом:

Код
unit UHook;

interface

uses Windows, Messages, SysUtils;

const
 MAP_NAME = 'MonitoringHandle';
 HOOK_NAME = 'HookName';

var
 hMonMap, hHookMap : THandle;
 pMonHandle : PHandle = nil;
 pHook : PHandle = nil;

function SetHook(MonitoringHandle: THandle): Boolean; stdcall;
function FreeHook:Boolean; stdcall;

implementation

procedure CheckHandle;
begin
 if not Assigned(pMonHandle) then
   raise Exception.Create('Monitoring handle not exists');
end;

procedure SetHandle(MonitoringHandle: THandle);
begin
 CheckHandle;
 pMonHandle^ := MonitoringHandle;
end;

function GetHandle: THandle;
begin
 CheckHandle;
 Result := pMonHandle^;
end;

function CbtProc(Code: integer; wParam, lParam: LongInt): LongInt; stdcall;
var
 RectPtr: PRect;
begin
 if Code < 0 then
 begin
   Result := CallNextHookEx(pHook^, Code, wParam, lParam);
   Exit;
 end;

 if (Code = HCBT_MOVESIZE) and (wParam = GetHandle) then
 begin
   RectPtr := PRect(lParam);
   MessageBox(GetHandle, PAnsiChar(Format('new width - %d, new height - %d',
              [RectPtr.Right - RectPtr.Left, RectPtr.Bottom - RectPtr.Top])),
              'Window resized', MB_OK);
 end;

 Result := CallNextHookEx(pHook^, Code, wParam, lParam);
end;

function SetHook(MonitoringHandle: THandle): Boolean; stdcall;
begin
 Result := False;
 SetHandle(MonitoringHandle);
 pHook^ := SetWindowsHookEx(WH_CBT, @CbtProc, hInstance, 0);
 Result := pHook^ <> 0;
end;

function FreeHook:Boolean; stdcall;
begin
 Result := UnhookWindowsHookEx(pHook^);
end;

function GetMappedPtr(MapName: PAnsiChar; out hFileMap: THandle; DataSize: Cardinal = sizeof(THandle)): PHandle;
var
 hMap: THandle;
begin

 hMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, MapName);

 if hMap = 0 then
   hMap := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0,
           DataSize, MapName);

 if hMap = 0 then
   raise Exception.Create('Error on create file mapping!');

 Result := MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, DataSize);
end;

procedure UnMap(MapPtr: Pointer; hMapFile: THandle);
begin
 if Assigned(MapPtr) then
   UnMapViewOfFile(MapPtr);

 if hMapFile <> 0 then
   CloseHandle(hMapFile);
end;

initialization

 pMonHandle := GetMappedPtr(MAP_NAME, hMonMap);
 pHook := GetMappedPtr(HOOK_NAME, hHookMap);

finalization

 UnMap(pMonHandle, hMonMap);
 UnMap(pHook, hHookMap);

end.


Компилишь ДЛЛ.

Затем создаешь новый проект(Application) и импортируешь туда эти функции:

Код
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

function SetHook(MonitoringHandle: THandle): Boolean; stdcall; external 'Hook.dll' name 'SetHook';
function FreeHook: Boolean; stdcall; external 'Hook.dll' name 'FreeHook';

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 // За место этого Handle поставь нужный тебе хендл
 SetHook(Handle);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 FreeHook;
end;

end.


Это сообщение отредактировал(а) <Spawn> - 24.1.2004, 22:17


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
DriveSoftware
Дата 24.1.2004, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



<Spawn>

Спасибо, попробую разобраться smile.gif
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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