如何从项目中的所有表单中捕获Esc键? [英] How to catch Esc key from all forms in project ?
本文介绍了如何从项目中的所有表单中捕获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.
- 将每个表单绑定到一个公共事件处理程序。
- 使用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 propertiesCancelButton
and/orAcceptButton
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 propertyKeyPreview
. Then you can handle the form eventPreviewKeyDown
or override the methodOnPreviewKeyDown
:
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屋!
查看全文