首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

天极网 > 软件频道 > 设计在线 > 网页UI设计 >全局消息

全局消息

2000-08-30 00:00作者:吴中卫出处:yesky责任编辑:

  在这里的全局消息是相对私有消息,即从WM_USER到0x7FFF范围的整型数,用户自定义的,在一个应用或一个窗口类对象间才能发送或侦听的消息而言的。随着应用的日趋复杂,我们有必要在不同的应用间,或在相同的应用间为不同的分工合作而产生的交流而开辟简单的通道,为此,可以有很多种不同的方法如管道、协议、消息等。

  而在一个Window的Session里面,消息是最为可靠、简单的。那么,如何确定消息被每一个用户侦听到呢?因为在SendMessage或PostMessage时,一般地,对于任何一个别的应用其句柄是无法事先得知的,因此,对任何并行的应用进行广播是确实可行的方法。全局广播句柄在Windows被定义为HWND_BROADCAST。

  另外,在进行全局广播时,必须让所广播的消息得到Windows的登记和确认,与私有消息不同的是,全局消息是通过你决定的消息字符串来得到的,也就是该消息是一个你定义的字符串,而消息句柄是由该字符串通过Windows登记后按一定的规则生成的返回值,如果在此之前该消息串已经有别的应用登记过了,那么所有的返回值都是同一值。

  消息登记的函数原形如下:

  

  UINT RegisterWindowMessage(

  LPCTSTR lpString //消息字串的地址

  );

  由于RegisterWindowMessage的消息句柄是一个不定数,我们不能简单的定义一个Message消息处理机制来侦听它,也不能放到Application.OnMessage里面来处理,因为Application会把它过滤掉。因此,必须上到Window类定义的原WNDPROC消息处理机制这一最低原始层次来考虑,这可以使用SetWindowLong函数来办到。

  下面是一简单的使用。

  首先建立一个Form,上面分别放上三个按钮"Register"、"SendMsg"和"Stop".

  然后把"SendMsg"和"Stop"的Enabled属性变为False,其意义是登记后方可使用。

  如果程序正确运行,就可以看到标题栏改变成“全局消息已收到”。

  原程序如下:

  unit Unit1;

  interface

  uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

  AppEvnts, StdCtrls;

  type

  TForm1 = class(TForm)

  Button1: TButton;

  Button2: TButton;

  Button3: TButton;

  procedure Button1Click(Sender: TObject);

  p edure FormCreate(Sender: TObject);

  procedure Button2Click(Sender: TObject);

  procedure Button3Click(Sender: TObject);

  procedure FormDestroy(Sender: TObject);

  private

  { Private declarations }

  public

  { Public declarations }

  end;

  var

  Form1: TForm1;

  implementationVar

  OldWNDProc : Pointer; //原Window类定义的WNDProc消息处理函数

  GlobeMsg : UInt; //全局消息句柄

  {$R *.DFM}

  function NewWNDProc(uHandle : hWnd; //发送消息的对象句柄

  Msg : UInt; //消息句柄

  ParamW : UInt; //消息参数W及消息参数L

  ParamL : UInt) : LongInt stdcall;

  begin

  if Msg = GlobeMsg then begin

  //侦听到全局消息

  Form1.Caption := Receive MEssage Globe Msg;

  //告知其后的对象,“我已处理过了"

  Result := 0;

  end else

  //让原函数处理

  Result := CallWindowProc(OldWNDProc,

  uHandle,

  Msg,

  ParamW,

  ParamL);end;

  procedure TForm1.Button1Click(Sender: TObject); // "Register" Buttonbegin

  GlobeMsg := RegisterWindowMessage(myTEST); //登记全局消息

  if GLobeMsg $#@60;$#@62; 0 then //登记失败为0

  OldWNDProc := Pointer(SetWindowLong(Handle,GWL_WNDPROC,LongInt(@NewWNDProc)));

  end;

  procedure TForm1.FormCreate(Sender: TObject);

  begin

  GlobeMsg := 0;

  end;

  procedure TForm1.Button2Click(Sender: TObject); // "SendMsg" Buttonbegin

  if GlobeMsg $#@60;$#@62; 0 Then SendMessage(HWND_BROADCAST, GlobeMsg, 0,0 ); //让所有人听到

  end;

  procedure TForm1.Button3Click(Sender: TObject); // "Stop" Buttonbegin

  SetWindowLong(Handle,GWL_WNDPROC,LongInt(OldWNDProc));

  end;

  procedure TForm1.FormDestroy(Sender: TObject);

  begin//让Destroy顺利进行

  button3Click(Sender);

  end;

  end.

关注此文的读者还看过:

返回软件频道首页

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

热门
推荐

网友关注

软件
资料
游戏

文章排行

本周
本月
最新更新
天极服务| 关于我们| About us| 网站律师| 电子杂志| RSS订阅| 友情合作| 加入我们| 网站地图| MSN/QQ上看天极
TMG
Copyright (C) 1999-2009 Yesky.com, All Rights Reserved
版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868 在线提交意见反馈
渝ICP证B2-20030003号  通用网址:天极网
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众
经营性网站备案信息 网警备案 中国网站排名