在delphi的一般窗体,你可以通过使钩子hook住tform的doshow方法。那样,窗体不管是否是showmodal的,都会触发,然后通过给此窗体发送一个特殊消息,并在此窗体中,使用钩子,处理此消息。那么就可以在窗体完全显示之后,真正处理你的任务了。这里有一个技巧,窗体真正显示,并不是调用doshow的时候,而是经过windows的消息循环,完全处理好所有显示相关消息之后。这里,通过消息循环机制,给它发送一个额外消息,那么可以保障,触发你的任务的时机,是在窗体处理完原有消息之后。
当然了,在vcl中,并不是这么简单就能处理所有问题。最主要的是那些标准windows窗体,比如messagebox,opendialog。这些窗体不是由tform组合而成的。所以对象和消息机制都不一样。需要单独处理。