如何从项目中的所有表单中捕获Esc键? [英] How to catch Esc key from all forms in project ?

查看:78
本文介绍了如何从项目中的所有表单中捕获Esc键?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,



我想知道如何在特定事件中部署Form并添加处理的类。

例如,在Esc上关键表单将关闭,但是对于我项目中的所有表单类型。

所以,我想在Form上添加部分类并捕获键事件,如果是ESC在当前表单上执行关闭操作。



有什么想法吗?

我知道我可以创建一个新的形式并继承,但我寻找更优雅的东西。



谢谢

Hallo,

I wonder how I can partial Form and add class that handle in specific event.
For example, on Esc Key the form will close, but for all kind of forms in my project.
So, I thought to add partial class on Form and capture the keys event and if is ESC do Close action on current form.

Any idea ?
I know that i can create a new Form of mine and inherit, but I look for somthing more elegant.

Thanks

推荐答案

我可以想到两种方式。

I can think of 2 ways.
  1. 将每个表单绑定到一个公共事件处理程序。
  2. 使用Windows api(例如SetWindowsHookEx)通过外部事件捕获按键事件。

    这将捕获应用程序中的每个按键。

    根据我的经验,此方法是错误且不可靠。


如果表单是模态的,那么取消和/或确定要好得多(应用,接受,完成)按钮用于完成模态状态。然后,您可以通过设置这些按钮的属性 CancelButton 和/或 AcceptButton 来处理取消(和/或回车):

https ://msdn.microsoft.com/en-us/library/system.windows.forms.form.cancelbutton(v = vs.110).aspx [ ^ ],

https:// msdn.microsoft.com/en-us/library/system.windows.forms.form.acceptbutton(v=vs.110).aspx [ ^ ]。



如果表单不是模态的,那么通过Escape关闭它将是一个非常非常糟糕的主意。但是当然你应该能够处理表单键盘事件。这里的诀窍是:重点通常是表单上的其他控件,所以你应该对它做些什么。这是通过设置表单属性 KeyPreview 来完成的。然后你可以处理表单事件 PreviewKeyDown 或覆盖方法 OnPreviewKeyDown

https://msdn.microsoft.com/en -us / library / system.windows.forms.form.keypreview(v = vs.110).aspx [ ^ ],

https://msdn.microsoft.com/en-us/ library / system.windows.forms.control.previewkeydown(v = vs.110).aspx [ ^ ],

https://msdn.microsoft.co m / en-us / library / system.windows.forms.control.onpreviewkeydown(v = vs.110).aspx [ ^ ]。



您提到您不想为所有表单执行某些操作。当然。您不应该重复不同表单类中的任何代码;相反,总是继承一些具有共同功能的基本表格类。



-SA
If the form is modal, it's much better to have "Cancel" and/or "OK" ("Apply", "Accept", "Done") buttons used to finish modal state. Then you can handle Cancel (and/or Enter) by setting the properties CancelButton and/or AcceptButton of these buttons:
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.cancelbutton(v=vs.110).aspx[^],
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.acceptbutton(v=vs.110).aspx[^].

If the form is not modal, closing it by Escape would be a really, really bad idea. But of course you should be able to handle form keyboard event. The trick here is: the focus is usually taken by some other control on the form, so you should do something about it. This is done by setting the form property KeyPreview. Then you can handle the form event PreviewKeyDown or override the method OnPreviewKeyDown:
https://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.110).aspx[^],
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown(v=vs.110).aspx[^],
https://msdn.microsoft.com/en-us/library/system.windows.forms.control.onpreviewkeydown(v=vs.110).aspx[^].

You mentioned that you don't want to do something for all forms. Of course. You should not repeat any code in different form classes; instead, always inherit some base form class with common functionality.

—SA


这篇关于如何从项目中的所有表单中捕获Esc键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆