Application.Run过程调用一个处理Windows消息的无限循环:

  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated;


只能通过Terminated过程将Application.Terminate属性设置为true,该过程发送PostQuitMesage。
我想更改消息处理循环,以便可以使用全局变量直接停止它(不使用消息队列):

var MyTerminated:Boolean
....
  repeat
    try
      HandleMessage;
    except
      HandleException(Self);
    end;
  until Terminated or MyTerminated;


问题是,是否有可能使程序使用您自己的Application.Run版本?

最佳答案

“终止”属性是只读的。但是,它是FTerminated字段的直接获取器,因此Application.Terminated直接从布尔字段读取。虽然该语言不允许设置Application.Terminated,但是您可以使用指针在该地址设置布尔值:

PBoolean(@Application.Terminated)^ := True;


您也可以考虑使用Halt,它可以使消息循环完全通过,从而获得更突然但更不容易破解的解决方案。

10-08 12:37