Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Новая WinProc

Delphi , ОС и Железо , Сообщения Windows



Автор: Xavier Pacheco

unit Scwndprc;

interface

uses Forms, Messages;

const
  DDGM_FOOMSG = WM_USER;

implementation

uses Windows, SysUtils, Dialogs;

var
  WProc: Pointer;

function NewWndProc(Handle: hWnd; Msg, wParam, lParam: Longint): Longint;
  stdcall;
{ This is a Win32 API-level window procedure. It handles the messages }
{ received by the Application window. }
begin
  if Msg = DDGM_FOOMSG then
    { If it's our user-defined message, then alert the user. }
    ShowMessage(Format('Message seen by WndProc! Value is: $%x', [Msg]));
  { Pass message on to old window procedure }
  Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;

initialization
  { Set window procedure of Application window. }
  WProc := Pointer(SetWindowLong(Application.Handle, gwl_WndProc,
    Integer(@NewWndProc)));
end.
unit Main;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type
  TMainForm = class(TForm)
    SendBtn: TButton;
    PostBtn: TButton;
    procedure SendBtnClick(Sender: TObject);
    procedure PostBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    OldWndProc: Pointer;
    WndProcPtr: Pointer;
    procedure WndMethod(var Msg: TMessage);
    procedure HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

uses ScWndPrc;

procedure TMainForm.HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
{ OnMessage handler for Application object. }
begin
  if Msg.Message = DDGM_FOOMSG then
    { if it's the user-defined message, then alert the user. }
    ShowMessage(Format('Message seen by OnMessage! Value is: $%x',
      [Msg.Message]));
end;

procedure TMainForm.WndMethod(var Msg: TMessage);
begin
  if Msg.Msg = DDGM_FOOMSG then
    { if it's the user-defined message, then alert the user. }
    ShowMessage(Format('Message seen by WndMethod! Value is: $%x', [Msg.Msg]));
  with Msg do
    { Pass message on to old window procedure. }
    Result := CallWindowProc(OldWndProc, Application.Handle, Msg, wParam,
      lParam);
end;

procedure TMainForm.SendBtnClick(Sender: TObject);
begin
  SendMessage(Application.Handle, DDGM_FOOMSG, 0, 0);
end;

procedure TMainForm.PostBtnClick(Sender: TObject);
begin
  PostMessage(Application.Handle, DDGM_FOOMSG, 0, 0);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.OnMessage := HandleAppMessage; // set OnMessage handler
  WndProcPtr := MakeObjectInstance(WndMethod); // make window proc
  { Set window procedure of application window. }
  OldWndProc := Pointer(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Integer(WndProcPtr)));
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  { Restore old window procedure for Application window }
  SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(OldWndProc));
  { Free our user-created window procedure }
  FreeObjectInstance(WndProcPtr);
end;

end.

Пример Windows-приложения, написанного на Delphi/Pascal, которое демонстрирует, как перехватывать и обрабатывать сообщения, отправленные в основное окно приложения.

Вот разбивка кода:

Scwndprc.pas

  • Это модуль определяет пользовательскую процедуру окна NewWndProc, которая обрабатывает пользовательские сообщения.
  • Функция NewWndProc вызывается, когда получается сообщение с значением DDGM_FOOMSG (константа, определенная в этом модуле). Она отображает сообщение в окне и затем передает сообщение оригинальной процедуре окна с помощью CallWindowProc.

Main.pas

  • Это модуль определяет форму (TMainForm) с двумя кнопками: SendBtn и PostBtn.
  • Когда кликается SendBtn, отправляется пользовательское сообщение в основное окно приложения с помощью SendMessage. Когда кликается PostBtn, то же самое сообщение отправляется с помощью PostMessage.
  • Процедура HandleAppMessage является обработчиком события OnMessage для приложения. Она проверяет, если полученное сообщение - это пользовательское сообщение, и отображает его значение в окне.
  • Процедура WndMethod вызывается, когда основное окно приложения получает сообщение. Она вызывает оригинальную процедуру окна с помощью CallWindowProc.
  • В процедуре FormCreate, она устанавливает обработчик события OnMessage в HandleAppMessage, создает экземпляр пользовательской процедуры окна (WndProcPtr) и устанавливает ее как новую процедуру окна для основного окна приложения.
  • В процедуре FormDestroy, она восстанавливает оригинальную процедуру окна и освобождает пользовательскую процедуру окна.

Ключевые концепции:

  • Процедуры окон (WinProc) - функции, которые обрабатывают сообщения, отправленные в окно.
  • Сообщения могут быть отправлены или опубликованы в окно с помощью SendMessage или PostMessage, соответственно.
  • Функция CallWindowProc используется для вызова оригинальной процедуры окна из пользовательской процедуры окна.

Улучшения:

  • Рекомендуется добавить обработку ошибок и валидацию ввода пользователя (например, проверять, является ли значение сообщения корректным).
  • Вам может потребоваться добавить более функциональности пользовательской процедуре окна, например, журналирование или отладочную информацию.
  • Код предполагает, что DDGM_FOOMSG - уникальная константа; убедитесь, что она не конфликтует с другими сообщениями, используемыми в вашем приложении.

В статье описывается создание пользовательской процедуры окна (WinProc) в программном обеспечении на языке Delphi, которая обрабатывает сообщения полученные приложением и может быть использована для уведомления пользователя о важных событ


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сообщения Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-29 02:57:14/0.024549961090088/1