从非活动表单发送showDialogue表单的命令

时间:2011-02-08 05:04:44

标签: c# .net winforms showdialog

我想将密钥发送到另一个非活动表单的显示对话表单。参见图片

enter image description here

表单a显示对话框。后面是另一种具有自定义键盘和小键盘的表单。 我只是针对这些按钮点击发送密钥。 我怎么可能从键盘发送键来显示对话形式。

1 个答案:

答案 0 :(得分:1)

你所要求的基本上是不可能的。一旦了解了模态对话框的工作方式(使用ShowDialog方法显示的表单是模态的),您就会明白原因。如果要强制用户仅与该对话框进行 交互,则使用模态对话框。它通过禁用那些窗口阻止它们与应用程序中的任何其他窗口进行交互。它们变得不受鼠标点击,不接收键盘输入,并且无法获得焦点。当你尝试时,Windows会发出哔哔声并闪烁模态对话框的标题栏,这是摇摇头,说“不,不,不”的非微妙方式。

所以这里发生的是当您使用ShowDialog方法将“存款”表单显示为模式对话框时,应用程序中的所有其他窗口都将被禁用。在您的特定情况下,这意味着包含您的屏幕键盘的窗口也被禁用,并且无法接收鼠标单击事件。这就是当你试图点击它的“键”(按钮)时没有发生任何事情的原因。

最简单的解决方法(正如我在评论中建议的那样)是使用Show方法将“存款”表单显示为 - 模式对话框。与模式对话框不同,这不会禁用应用程序中的其他窗口,允许用户同时与所有窗口进行交互。单击另一个窗口将焦点设置到该窗口并允许它处理输入事件。但是你说这对你来说是行不通的,因为你希望“存款”表单禁用窗口上的每个控件,但你的屏幕键盘。

当然,当我说“不可能”时,我开始撒谎。我的意思是,它非常棘手,并且需要您解决标准的Windows交互模型。一些想法
关于你如何去做那个春天:

  1. 您可以使用所有最新版本的Windows附带的屏幕键盘实用程序。 Microsoft已经为此提供了一个程序。您不必构建和维护自己的,它已经包含了所有必要的逻辑,以防止它在用户点击其中一个“键”时窃取焦点,并且因为它不是您的程序的一部分,它使用ShowDialog方法将表单显示为模态时,不会禁用此功能。要查看它,请转到开始 - >运行并输入osk

    例如,在Windows 7中,它看起来像这样:

    On-Screen Keyboard in Windows 7

  2. 如果您坚持使用自定义设计的屏幕键盘,则必须将其显示为模式对话框的子窗口。也就是说,您的应用程序通常以其主要表单开头。然后,当您使用ShowDialog方法将“存款”表单显示为模式对话框时,主窗体将被禁用。在“存款”表单中,您可以使用 - 模式Show方法显示屏幕键盘表单。主窗体仍然处于禁用状态,因为它显示的是模态对话框(“存储”窗体)。但“存款”表单未被禁用,因为它显示 - 模式对话框(屏幕键盘)。