当前位置: 首页 > 工具软件 > VCL > 使用案例 >

vcl消息

山凌
2023-12-01

http://blog.csdn.net/stbrine/article/details/6637769

---直接向这个HWND发送字符

procedure TForm1.Button1Click(Sender: TObject);

var
  s:string;
  H:HWND;
begin
  s:='abc';
  h:=Edit1.Handle;
  SendMessage(h, WM_SETTEXT, 0, LongInt(@s[1]));
end;

end.


---

http://www.cnblogs.com/del/archive/2008/10/24/1319043.html

Panel1发送 WM_MOUSEMOVE 消息,如何Panel.OnMOUSEMOVE指向了某段代码,则会运行这段代码

Panel1.Perform(WM_MOUSEMOVE, MK_SHIFT, y shl 16 or x);
 
--
直接使用消息方法是最快的方法
inherited :系统收到消息后, 会告诉顶向下 窗体发生的事情, 然后窗体再做出反应; 当然窗体能否做出反应要看窗体是否有相应的响应代码.
override:改写了父类的该消息方法,要使用inherited,子类才能收到改消息,因为父类的改消息方法被改过了,不是执行以前的那个了。
 
--http://www.cnblogs.com/del/archive/2008/10/24/1319086.html
Application.OnMessage 
响应 WM_MOUSEMOVE 以外的所有消息
    {这个自定义过程要复合 Application.OnMessage 的参数格式}
    procedure MyMessage(var Msg: tagMSG; var Handled: Boolean);
TApplicationEvents.OnMessage 的第二个参数 Handled 如果是 True, 表示消息已经处理过了, 到此为止.我们可以利用这个特性来屏蔽一些消息
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if Msg.message = WM_LBUTTONDOWN then
  begin
    Memo1.Lines.Add('OnMessage');
    Handled := False; {Handled 默认是 False, 这句可以省略}
//    Handled := True;  {如果这样, 下面 OnMouseDown 事件将不会得到执行}
  end;
end;

WndProc函数作用:

主要用在拦截并处理系统消息和自定义消息

比如:
windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息。这个函数就是默认的消息处理函数。你可以重载这个函数来制定自己的消息处理流程.

procedure WndProc(var Message: TMessage); override;
procedure TForm1.WndProc(var Message: TMessage);
begin
  inherited;
  if Message.Msg = WM_LBUTTONDOWN then
    ShowMessage('WndProc');
end;

end.
在TObject类中,有一个Dispatch()方法和一个DefaultHandler()方法,它们都是与消息
分发机制相关的。
Dispatch()负责将特定的消息分发给合适的消息处理函数。首先它会在对象本身类型的类中寻找该消息的处理函数,如果找到,则调用它;如果没有找到而该类覆盖了TObject的DefaultHandler(),则调用该类的DefaultHandler();如果两者都不存在,则继续在其基类中寻找,直至寻找到TObject这一层,而TObject已经提供了默认的DefaultHandler()

procedure Dispatch(var Message); override;
procedure TForm1.Dispatch(var Message);
begin
  inherited;
  if TMessage(Message).Msg = WM_LBUTTONDOWN then
    ShowMessage('Dispatch');
end;

http://www.cnblogs.com/del/archive/2008/10/28/1321490.html
Perform、SendMessage 会直接发送消息到窗体过程; 

PostMessage 是把消息放入消息队列.

因为 Application.OnMessage 只接收队列中的消息, 
所以 Perform、SendMessage 发送的消息, OnMessage 收不到.

OnMessage 只相应消息队列中的消息

http://www.cnblogs.com/del/archive/2008/10/29/1322112.html

消息结构纵览

系统标准的消息结构在 Delphi 中被定义为 TMsg
PMsg = ^TMsg;
tagMSG = packed record
  hwnd: HWND;
  message: UINT;
  wParam: WPARAM;
  lParam: LPARAM;
  time: DWORD;
  pt: TPoint;
end;
TMsg = tagMSG;
MSG = tagMSG;
TMessage 是 VCL 重新定义的消息结构:
PMessage = ^TMessage;
TMessage = packed record
  Msg: Cardinal;
  case Integer of
    0: (
      WParam: WPARAM;
      LParam: LPARAM;
      Result: LRESULT);
    1: (
      WParamLo: Word;
      WParamHi: Word;
      LParamLo: Word;
      LParamHi: Word;
      ResultLo: Word;
      ResultHi: Word);
end;

  
  


 

 类似资料: