我想从另一个非活动表单发送密钥到显示对话表单。参见图片
表格 a 正在显示对话。后面是另一个具有自定义键盘和小键盘的表格。我只是针对这些按钮点击发送密钥。我怎么可能从键盘发送键来显示对话形式。
我想从另一个非活动表单发送密钥到显示对话表单。参见图片
表格 a 正在显示对话。后面是另一个具有自定义键盘和小键盘的表格。我只是针对这些按钮点击发送密钥。我怎么可能从键盘发送键来显示对话形式。
你问的基本上是不可能的。一旦您了解了模态对话框的工作原理(使用该ShowDialog
方法显示的表单是模态的),您就会明白为什么。当您想强制用户仅与该对话框交互时,使用模式对话框。它通过禁用这些窗口来防止它们与应用程序中的任何其他窗口进行交互。它们变得不受鼠标点击的影响,无法接收键盘输入,也无法获得焦点。当您尝试时,Windows 会向您发出哔哔声并闪烁模态对话框的标题栏,这是摇头并说“不,不,不”的非微妙方式。
所以这里发生的事情是,当您使用该方法将“存款”表单显示为模式对话框ShowDialog
时,应用程序中的所有其他窗口都被禁用。在您的特定情况下,这意味着包含您的屏幕键盘的窗口也被禁用,并且无法接收鼠标单击事件。这就是为什么当您尝试单击它的“键”(按钮)时什么都没有发生的原因。
最简单的解决方法(正如我在评论中建议的那样)是使用该方法将您的“存款”表单显示为非模态对话框Show
。与模态对话框不同,这不会禁用应用程序中的其他窗口,允许用户一次与所有窗口进行交互。单击另一个窗口会将焦点设置到该窗口并允许它处理输入事件。但是您说这对您不可行,因为您希望“存款”表单禁用主窗口上的每个控件,而不是屏幕键盘。
当然,我一开始就说“不可能”是在撒谎。我的意思是它非常棘手,并且需要您使用标准的 Windows 交互模型。
关于如何去做这件事的一些想法浮现在脑海中:
您可以使用所有最新版本的 Windows 中包含的屏幕键盘实用程序。Microsoft 已经为此提供了一个程序。您不必构建和维护自己的,它已经包含所有必要的逻辑,以防止它在用户单击其“键”之一时窃取焦点,并且由于它不是您程序的一部分,因此它当您使用该方法将表单显示为模态时,不会被禁用。ShowDialog
要查看它,请转到开始 -> 运行并键入osk
.
例如,在 Windows 7 中,它看起来像这样:
如果您坚持使用自己的定制设计的屏幕键盘,则必须将其显示为模态对话框的子窗口。也就是说,您的应用程序通常从其主窗体开始。然后,当您使用该方法将“存款”表单显示为模式对话框ShowDialog
时,主表单将被禁用。从“存款”表格中,您可以使用非模态Show
方法显示屏幕键盘表格。主窗体仍处于禁用状态,因为它显示了一个模式对话框(“存款”窗体)。但是“存款”表单没有被禁用,因为它显示了一个非模态对话框(您的屏幕键盘)。