Перехват сообщения WM_SYSCOMMAND / LM_SYSCOMMAND

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Перехват сообщения WM_SYSCOMMAND / LM_SYSCOMMAND

Сообщение alt » 02.07.2010 12:51:47

Уважаемые форумчане!
Как в Lazarus отловить сообщение WM_SYSCOMMAND (или LM_SYSCOMMAND)?
Если создать процедуру вида:

Код: Выделить всё
procedure WMSysCommand (var Msg: TWMSysCommand); message WM_SYSCOMMAND;


сообщение не ловится.
Некоторые другие сообщения (н-р WM_SIZE) перехватываются без проблем.

На багтрекере нашел такую же тему (http://bugs.freepascal.org/view.php?id=13442) - насколько я понял, проблема решена.
Скачиваю прикрепленный пример, компилирую его - сообщение не ловится :(

Перехват сообщения WM_SYSCOMMAND необходим для того, чтобы отловить событие максимизации окна, отменить, собственно, максимизацию, и задать окну некоторые определенные размеры.
Согласно MSDN (http://msdn.microsoft.com/en-us/library/aa926857.aspx), сообщение WM_SIZE посылается после того, как размер окна изменится, поэтому его перехват не подходит.

Если перехват сообщения невозможен, подскажите, пожалуйста, как отловить максимизацию окна другими способами?

Версия Lazarus: 0.9.28.2 бета от 2009-10-25
Версия FPC: 2.2.4
Ревизия SVN: 22279
i386-win32-win32/win64

ОС: Windows 7 Максимальная 64-разрядная
alt
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.07.2010 12:13:20
Откуда: Казахстан

Re: Перехват сообщения WM_SYSCOMMAND / LM_SYSCOMMAND

Сообщение Mr.Smart » 02.07.2010 13:10:43

Недавно возился с максимизацией. Кроссплатформенный способ - это эвент OnWindowStateChange.
Проверяете WindowState на значение wsMaximized и меняете размеры как вам нужно.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Перехват сообщения WM_SYSCOMMAND / LM_SYSCOMMAND

Сообщение alt » 02.07.2010 14:59:12

Mr.Smart
Спасибо, все работает :)
alt
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.07.2010 12:13:20
Откуда: Казахстан

Re: Перехват сообщения WM_SYSCOMMAND / LM_SYSCOMMAND

Сообщение Maxizar » 02.07.2010 15:35:02

Вот решил показать как я в свое время делал правда ловил другое сообщение а именно: WM_GETMINMAXINFO. Но о чудо в Лазарусе не сработало а вот с WindowStateChange все ок.
Может кто на счет WM_GETMINMAXINFO на БагТрекере отпишет...
Код: Выделить всё
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  Messages;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormWindowStateChange(Sender: TObject);
  private
    { private declarations }
  public
    procedure WMSysCommand (var M:TWMGetMinMaxInfo); message WM_GETMINMAXINFO;
    { public declarations }
  end;

var
  Form1: TForm1;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormWindowStateChange(Sender: TObject);
begin
//В Лазарусе работает :)
if WindowState = wsMaximized then
    Form1.Width:=100;
    Form1.Height:=100;
end;

procedure TForm1.WMSysCommand(var M:TWMGetMinMaxInfo);
begin
// К сожалению работает только в Делфи лично проверил в D2009
with M.MinMaxInfo^ do
  begin
    ptMinTrackSize.x:=400;             { минимальная ширина окна }
    ptMinTrackSize.y:=200;             { минимальная высота окна }
    ptMaxTrackSize.x:=450;             { максимальная ширина окна }
    ptMaxTrackSize.y:=250;             { максимальная высота окна }
    ptMaxPosition.x:=BoundsRect.Left;  { максимальная позиция окна по оси Х после максимизации }
    ptMaxPosition.y:=BoundsRect.top;   { максимальная позиция окна по оси У после максимизации }
    ptMaxSize.x:=450;                  { максимальная ширина окна после максимизации }
    ptMaxSize.y:=250;                  { максимальная высота окна после максимизации }
  end;
  inherited;
end;

end.

Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Перехват сообщения WM_SYSCOMMAND / LM_SYSCOMMAND

Сообщение alt » 03.07.2010 10:43:28

Cкачал последнюю ночную сборку Lazarus:
ftp://ftp.hu.freepascal.org/pub/lazarus/snapshots/Lazarus-0.9.29-26434-fpc-2.4.1-20100703-win32.exe.
Проверил: WM_SYSCOMMAND / LM_SYSCOMMAND ловятся :). Проверил ряд других сообщений.

Перехватываются:
WM_SYSCOMMAND
WM_SIZE
WM_MOVE
WM_WINDOWPOSCHANGED


Не перехватываются:
WM_GETMINMAXINFO
WM_ENTERSIZEMOVE
WM_EXITSIZEMOVE
WM_WINDOWPOSCHANGING
alt
незнакомец
 
Сообщения: 4
Зарегистрирован: 02.07.2010 12:13:20
Откуда: Казахстан


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 48

Рейтинг@Mail.ru