所以,我有这个虚拟键盘。。。
它位于dll中,并且基于StayOnTop模态表单。它由一个函数调用,该函数返回一个带有键入文本的WideString。这个虚拟键盘有自己的TEdit,用户可以在那里写字,看看他在写什么。
所需的行为是使KB表单保持在顶部并具有焦点,直到按下Esc或Enter键。
对该键盘的调用之一发生在主窗体的OnShow事件中,因此在第一次调用键盘时不可见。
这种事一直发生到现在。
我创建了一个splash表单来引导用户完成各种步骤,直到主表单真正加载:皮肤加载、插件加载、数据库初始化等。
DataModule OnCreate一执行,启动屏幕就会显示,并在主窗体的OnActivate上关闭。所以这个飞溅形态不是StayOnTop——它不需要,因为它是在主形态出现的那一刻关闭的。
在中间的某个地方,键盘会显示出来,这样用户就可以输入一些所需的数据。
根据我的说法,键盘应该抓住焦点,因为它是一个模态窗口,但事实是,在我点击键盘窗体之前,飞溅窗体一直有焦点,这是我想要避免的。
如果在键盘之前调用splash表单,没有Modal,没有StayOnTop,有人能告诉我为什么它保持焦点,以及如果可能的话如何避免它吗。
PS:我确实在SO中发现了关于类似问题的其他问题,但事实恰恰相反:希望StayOnTop形式将注意力分散到主要问题上。这不是我需要的。
好吧,我解决了我的问题。一个简单的问题是。。。
在调用键盘之前,我刚刚添加了Application.ProcessMessages。
现在,只要键盘可见,焦点就会转移到键盘上。