如何创建一个纯winapi窗口

时间:2011-08-01 15:55:47

标签: delphi

目标是在两个线程之间创建通信,其中一个是主线程。我正在寻找的是创建一个占用较少资源的窗口,并将其用于仅接收消息。

你能告诉我什么?

3 个答案:

答案 0 :(得分:7)

这是message-only windows的用途。我在a previous question编写了一个Delphi发送+接收系统示例。

答案 1 :(得分:7)

您需要做的是在线程中设置一个消息循环,并在主线程中使用AllocateHWnd来向后和向前发送消息。这很简单。

在你的线程执行函数中有以下内容:

procedure TMyThread.Execute;
begin
  // this sets up the thread message loop
  PeekMessage(LMessage, 0, WM_USER, WM_USER, PM_NOREMOVE);

  // your main loop
  while not terminated do
  begin
    // look for messages in the threads message queue and process them in turn.
    // You can use GetMessage here instead and it will block waiting for messages
    // which is good if you don't have anything else to do in your thread.
    while PeekMessage(LMessage, 0, WM_USER, $7FFF, PM_REMOVE) do
    begin
      case LMessage.Msg of
      //process the messages
      end;
    end;

    // do other things. There would probably be a wait of some 
    // kind in here. I'm just putting a Sleep call for brevity
    Sleep(500);

  end;
end;

要向您的主题发送消息,请执行以下操作:

PostThreadMessage(MyThread.Handle, WM_USER, 0, 0);

在主线程方面,使用AllocateHWnd(在Classes单元中)设置一个窗口句柄,并传递一个WndProc方法。 AllocateHWnd非常轻巧,易于使用:

TMyMessageReciever = class
private
  FHandle: integer;

  procedure WndProc(var Msg: TMessage);

public
  constructor Create;
  drestructor Destroy; override;

  property Handle: integer read FHandle;

end;

implementation

constructor TMyMessageReciever.Create;
begin
  inherited Create;
  FHandle := Classes.AllocateHWnd(WndProc);
end;

destructor TMyMessageReciever.Destroy;
begin
  DeallocateHWnd(FHandle);
  inherited Destroy;
end;

procedure TMyMessageReciever.WndProc(var Msg: TMessage);
begin
  case Msg.Msg of
  //handle your messages here
  end;
end;

使用SendMessage发送消息,这将阻止消息处理,或PostMessage异步执行消息。

希望这有帮助。

答案 2 :(得分:2)

Gabr的OmniThread Library提供了一个很好的小单位DSiWin32,您可以使用它来创建消息窗口,或者您可以使用OmniThread为您进行通信。