发消息给非windows窗体程序

unit Unit1;

interface

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

var
  WM_SHUTDOWN_THREADS: Cardinal;  //无符号32位


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure WndProc(var Message: TMessage); override;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TTestThread = class(TThread)
  Private
    FWinHandle: THandle;
    FSignalShutdown: Boolean;
  public
    constructor Create;
    Procedure Execute(); Override;
    Destructor Destroy; Override;
    procedure WndProc(var Message: TMessage);
    Procedure PrntMsg(msg: String);
  end;

var
  Form1: TForm1;

implementation
var
  TestThread: TTestThread;


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Lines.Clear;
  //创建消息标志符
  WM_SHUTDOWN_THREADS := RegisterWindowMessage('MyMessage');
  if WM_SHUTDOWN_THREADS = 0 then
  Begin
    Raise Exception.Create('获取消息句柄失败!');
  end;
end;

{ TTestThread }

constructor TTestThread.Create;
begin
  Inherited Create(False);
  FSignalShutdown := False;
  //建立窗口句柄
  FWinHandle := AllocateHwnd(WndProc);
end;


destructor TTestThread.Destroy;
begin
  //释放窗口句柄
  DeAllocateHwnd(FWinHandle);
  inherited;
end;

procedure TTestThread.Execute;
begin
  inherited;
  while (not FSignalShutdown) do
  Begin
    sleep(1000);
  end;
  PrntMsg('');
end;

procedure TTestThread.PrntMsg(msg: String);
begin
  Form1.Memo1.Lines.Add('线程' + IntToStr(ThreadID) + '关闭!');
end;

procedure TTestThread.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_SHUTDOWN_THREADS then
    FSignalShutdown := True
  else
    Message.Result := DefWindowProc(FWinHandle, Message.Msg, Message.WParam, Message.LParam);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  //广播消息
  SendMessage(wnd_Broadcast, WM_SHUTDOWN_THREADS, 0, 0);
end;

procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  if Message.Msg = WM_SHUTDOWN_THREADS then
    ShowMessage('消息到了!');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TestThread := TTestThread.Create;
end;

end.

转载于:https://www.cnblogs.com/abcliu110/archive/2010/09/19/1831093.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值