【发布时间】:2014-03-02 01:21:27
【问题描述】:
所以,我有这个虚拟键盘...
它在一个 dll 中,并且基于一个 StayOnTop 模态表单。 它由一个函数调用,该函数返回一个带有输入文本的 WideString。 这个虚拟键盘有它自己的 TEdit,用户可以在其中书写并查看他正在书写的内容。
所需的行为是它们的 KB 表单保持在顶部并具有焦点,直到按下 Esc 或 Enter 键。
对该键盘的调用发生在主窗体的 OnShow 事件中,因此在第一次调用键盘时它是不可见的。
直到现在,这总是发生。
我创建了一个启动表单来引导用户完成在主表单实际加载之前发生的各个步骤:皮肤加载、插件加载、数据库初始化等。
DataModule OnCreate 执行后立即显示启动画面,并在主窗体的 OnActivate 上关闭。 所以这个启动表单不是 StayOnTop - 它不需要,因为它会在主表单出现的那一刻关闭。
在中间的某个地方,键盘出现了,所以用户可以输入一些需要的数据。
根据我的说法,键盘应该抓住焦点,因为它是一个模态窗口,但事实是,在我点击键盘表单之前,启动表单一直是焦点,这是我想要避免的。
如果在键盘之前调用了启动表单,没有Modal,没有StayOnTop,有人可以告诉我为什么它保持焦点,以及如果可能的话如何避免它。
PS: 我确实在 SO 中找到了关于类似问题的其他问题,但结果恰恰相反:希望 StayOnTop 表单将注意力集中在主要表单上。这不是我需要的。
【问题讨论】:
-
在键盘窗口的 OnShow 中调用 SetForegroundWindow。
-
键盘窗体的弹出父级是什么?
-
@SertacAkyuz:我刚刚做了,但没有改变......焦点仍然转到后台的启动表单
-
您希望哪种形式成为弹出父项?为什么这是在 DLL 中?
-
@nuno - 好的。如果没有测试用例,我不认为我真的能猜到发生了什么......
标签: delphi modal-dialog lost-focus stayontop