DelphiでのMessageメッセージの3つの使い方は、シンプルで直感的です
6529 ワード
インスタンス1
unit Unit1;
interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; constWM_ME=WM_USER+100;//カスタムメッセージ;type TForm1 = class(TForm) Button1: TButton;procedure Button1Click(Sender: TObject);//第1のメッセージ処理方式;定数メッセージのみを処理できます.procedure wmme(var message:TMessage);message WM_ME;//カスタムメッセージ処理プロセス、WM_専用処理MEメッセージpublic//第2のメッセージ処理方式;定数または変数メッセージを処理する可能性があります.procedure WndProc(var message:TMessage);override;//リロードウィンドウメッセージプロセス//第3のメッセージ処理方式procedure WMCommand(var Message:TWMcommand);message WM_COMMAND;//コマンドメッセージ処理プロセスprocedure WMSysCommand(var Msg:TWMsyCommand);message WM_SYSCOMMAND;//システムメッセージを処理する.end;var Form1: TForm1;implementation{$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);begin SendMessage(Handle,WM_ME,0,0);//送信メッセージWM_ME ; メッセージはまずWndProcによって処理され、wmme処理に渡される.end; procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);begin//次のコードの役割は、ユーザーがタイトルバーの最小化ボタンと閉じるボタンをクリックすると、フォームを非表示にすることです.if (Msg.CmdType=SC_MINIMIZE) or (Msg.CmdType=SC_CLOSE) then begin Self.Hide;//システムメッセージはブロックされ(通常メッセージはブロックできないと思います)、DefaultHandlerは実行されません.テストでは、この文の前と後にDefaultHandlerを置くことができ、前後の順序が明らかになります.end else DefaultHandler(Msg);//この文の役割は、他のメッセージを処理し続けることです.end; procedure TForm1.WMCommand(var Message: TWMCommand);begin//第3のメッセージ処理方式if Message.NotifyCode = BN_CLICKED then//すべてのメッセージをブロックできるのではないかと疑っています.if FindControl(Message.Ctl)=Button 1 then showmessage(‘Button 1をクリックした’);inherited;//この言葉を遮ると、Button 1 Clickの内容はendを実行しなくなります.procedure TForm1.WndProc(var message: TMessage);begin if message.Msg=WM_ME then//第2のメッセージ処理方式、私はすべてのメッセージをブロックすることができることを疑っていますか?ShowMessage(IntToStr(Handle)+ 'WndProc'); inherited WndProc(Message);//ここでinheritedはwmmeメッセージをトリガーします.したがって、WndProcを先に実行し、wmmeメッセージendを実行する.
procedure TForm1.wmme(var message: TMessage);beginShowMessage(IntToStr(Handle)+ 'wmme');//第1のメッセージ処理方式end;
end. ==================================メッセージのブロードキャスト方法====================================================================////////////////////////////////////////////////////////////////////////////unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure WndProc(var message:TMessage);override; end;var Form1: TForm1; MyMessage: DWORD;
implementation{$R *.dfm}{ TForm1 }procedure TForm1.WndProc(var message: TMessage);//カスタムメッセージbegin if messageを処理できます.Msg=MyMessage then//第3歩:Windowsメッセージ処理プロセスを再ロードし、受信したMyMessageメッセージを処理する.ShowMessage(FloatToStr(Handle)+ 'MyMessage');//プログラムが閉じてから起動するたびに、ハンドルの値が異なります.しかし、閉じないのは同じ値inherited WndProc(Message);//実は何の役にも立たないが、遮蔽後にエラーend;procedure TForm1.Button1Click(Sender: TObject);begin SendMessage(HWND_BROADCAST,MyMessage,0,0);//第2歩:MyMessageメッセージを送信し、ブロードキャストに相当する.また,両方のプログラムが実行されると,一方が他方を処理してから処理を開始する.PostMessageの違いend;/////////////////////////Windowsメッセージを登録しておく.第1の方法///////////////////procedure TFOrm 1.FormCreate(Sender: TObject);begin//同じ文字列、例えば'MyMessageMe'が異なるプログラムでRegisterWindowMessage登録メッセージを呼び出した場合、返されるMyMessageの結果は同じです.これにより、異なるプログラム間でメッセージをブロードキャストすることが可能になる.すなわち、異なるプログラムがメッセージを登録する場合、同じ注記列を登録する必要があります.MyMessage:=RegisterWindowMessage('MyMessageMe');//ステップ1:Windowsメッセージを登録し、返される値MyMessageend;//////////////////////////////////////////////////////////Windowsメッセージを登録しておく.第2の方法//////////////////{initialization MyMessage:=RegisterWindowMessage('MyMessageMe');}//BroadcastSystemMessageは、プロセス間でメッセージをブロードキャストすることができます.procedure TForm1.SendSMSMessage;var SMSMessage:Cardinal; recipt:Cardinal;begin try SMSMessage:=RegisterWindowMessage('SendSMSMessage'); recipt:=BSM_ALLDESKTOPS;//したがって、デスクトッププログラムはBroadcastSystemMessage(BSF_POSTESSAGE,@recipt,SMSMessage,0,0)を受信することができる.except
end;end; end.
参照先:
http://www.cnblogs.com/key-ok/p/3417727.html
===================================================================
unit Unit1;
interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; constWM_ME=WM_USER+100;//カスタムメッセージ;type TForm1 = class(TForm) Button1: TButton;procedure Button1Click(Sender: TObject);//第1のメッセージ処理方式;定数メッセージのみを処理できます.procedure wmme(var message:TMessage);message WM_ME;//カスタムメッセージ処理プロセス、WM_専用処理MEメッセージpublic//第2のメッセージ処理方式;定数または変数メッセージを処理する可能性があります.procedure WndProc(var message:TMessage);override;//リロードウィンドウメッセージプロセス//第3のメッセージ処理方式procedure WMCommand(var Message:TWMcommand);message WM_COMMAND;//コマンドメッセージ処理プロセスprocedure WMSysCommand(var Msg:TWMsyCommand);message WM_SYSCOMMAND;//システムメッセージを処理する.end;var Form1: TForm1;implementation{$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);begin SendMessage(Handle,WM_ME,0,0);//送信メッセージWM_ME ; メッセージはまずWndProcによって処理され、wmme処理に渡される.end; procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);begin//次のコードの役割は、ユーザーがタイトルバーの最小化ボタンと閉じるボタンをクリックすると、フォームを非表示にすることです.if (Msg.CmdType=SC_MINIMIZE) or (Msg.CmdType=SC_CLOSE) then begin Self.Hide;//システムメッセージはブロックされ(通常メッセージはブロックできないと思います)、DefaultHandlerは実行されません.テストでは、この文の前と後にDefaultHandlerを置くことができ、前後の順序が明らかになります.end else DefaultHandler(Msg);//この文の役割は、他のメッセージを処理し続けることです.end; procedure TForm1.WMCommand(var Message: TWMCommand);begin//第3のメッセージ処理方式if Message.NotifyCode = BN_CLICKED then//すべてのメッセージをブロックできるのではないかと疑っています.if FindControl(Message.Ctl)=Button 1 then showmessage(‘Button 1をクリックした’);inherited;//この言葉を遮ると、Button 1 Clickの内容はendを実行しなくなります.procedure TForm1.WndProc(var message: TMessage);begin if message.Msg=WM_ME then//第2のメッセージ処理方式、私はすべてのメッセージをブロックすることができることを疑っていますか?ShowMessage(IntToStr(Handle)+ 'WndProc'); inherited WndProc(Message);//ここでinheritedはwmmeメッセージをトリガーします.したがって、WndProcを先に実行し、wmmeメッセージendを実行する.
procedure TForm1.wmme(var message: TMessage);beginShowMessage(IntToStr(Handle)+ 'wmme');//第1のメッセージ処理方式end;
end. ==================================メッセージのブロードキャスト方法====================================================================////////////////////////////////////////////////////////////////////////////unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure WndProc(var message:TMessage);override; end;var Form1: TForm1; MyMessage: DWORD;
implementation{$R *.dfm}{ TForm1 }procedure TForm1.WndProc(var message: TMessage);//カスタムメッセージbegin if messageを処理できます.Msg=MyMessage then//第3歩:Windowsメッセージ処理プロセスを再ロードし、受信したMyMessageメッセージを処理する.ShowMessage(FloatToStr(Handle)+ 'MyMessage');//プログラムが閉じてから起動するたびに、ハンドルの値が異なります.しかし、閉じないのは同じ値inherited WndProc(Message);//実は何の役にも立たないが、遮蔽後にエラーend;procedure TForm1.Button1Click(Sender: TObject);begin SendMessage(HWND_BROADCAST,MyMessage,0,0);//第2歩:MyMessageメッセージを送信し、ブロードキャストに相当する.また,両方のプログラムが実行されると,一方が他方を処理してから処理を開始する.PostMessageの違いend;/////////////////////////Windowsメッセージを登録しておく.第1の方法///////////////////procedure TFOrm 1.FormCreate(Sender: TObject);begin//同じ文字列、例えば'MyMessageMe'が異なるプログラムでRegisterWindowMessage登録メッセージを呼び出した場合、返されるMyMessageの結果は同じです.これにより、異なるプログラム間でメッセージをブロードキャストすることが可能になる.すなわち、異なるプログラムがメッセージを登録する場合、同じ注記列を登録する必要があります.MyMessage:=RegisterWindowMessage('MyMessageMe');//ステップ1:Windowsメッセージを登録し、返される値MyMessageend;//////////////////////////////////////////////////////////Windowsメッセージを登録しておく.第2の方法//////////////////{initialization MyMessage:=RegisterWindowMessage('MyMessageMe');}//BroadcastSystemMessageは、プロセス間でメッセージをブロードキャストすることができます.procedure TForm1.SendSMSMessage;var SMSMessage:Cardinal; recipt:Cardinal;begin try SMSMessage:=RegisterWindowMessage('SendSMSMessage'); recipt:=BSM_ALLDESKTOPS;//したがって、デスクトッププログラムはBroadcastSystemMessage(BSF_POSTESSAGE,@recipt,SMSMessage,0,0)を受信することができる.except
end;end; end.
参照先:
http://www.cnblogs.com/key-ok/p/3417727.html
===================================================================
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WndProc(var AMessage:TMessage);override;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WndProc(var AMessage: TMessage);
begin
if (AMessage.Msg=WM_SYSCOMMAND) and (AMessage.WParam=SC_CLOSE) then
Exit
else
inherited;
end;
end.