Новая WinProcDelphi , ОС и Железо , Сообщения 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
Main.pas
Ключевые концепции:
Улучшения:
В статье описывается создание пользовательской процедуры окна (WinProc) в программном обеспечении на языке Delphi, которая обрабатывает сообщения полученные приложением и может быть использована для уведомления пользователя о важных событ Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: Сообщения Windows ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |