如果要在工作线程中处理消息,则必须手动运行消息循环,例如:
procedure TMyThread.Execute;
var
Msg: TMsg;
begin
...
while GetMessage(Msg, 0, 0, 0) > 0 then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
...
end;
或者:
procedure TMyThread.Execute;
var
Msg: TMsg;
begin
...
while not Terminated do
begin
...
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
...
end;
...
end;
或者:
procedure TMyThread.Execute;
var
Msg: TMsg;
begin
...
while not Terminated do
begin
...
if MsgWaitForMultipleObjects(0, nil, FALSE, SomeTimeout, QS_ALLINPUT) = WAIT_OBJECT_0 then
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
...
end;
...
end;