gpt4 book ai didi

.net - 设置 Form.KeyPreview = true 的缺点?

转载 作者:可可西里 更新时间:2023-11-01 12:11:25 26 4
gpt4 key购买 nike

我想知道 Form.KeyPreview 属性到底有什么用?它为什么存在,我将其设置为 true 有什么“风险”?我想它一定有一些负面影响 - 否则它根本不应该存在(或者至少默认情况下是正确的)?

编辑:我非常清楚它的作用。我在问为什么。为什么我必须将它设置为 true 才能触发键盘事件?为什么键盘事件总是不会为表单触发。什么不只是标准行为?

我问的具体原因是:我刚刚在我的应用程序的基本形式中设置了 KeyPreview = true,所有其他形式都继承自该形式。我会遇到任何令人讨厌的惊喜吗?

最佳答案

Form.KeyPreview 有点不合时宜,继承自用于表单设计的 Visual Basic 对象模型。回到 VB6 时代,您需要 KeyPreview 才能实现快捷键击。在 Windows 窗体中不再需要它,覆盖 ProcessCmdKey() 是更好的解决方案:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (keyData == (Keys.Control | Keys.F)) {
DoSomething(); // Implement the Ctrl+F short-cut keystroke
return true; // This keystroke was handled, don't pass to the control with the focus
}
return base.ProcessCmdKey(ref msg, keyData);
}

但是在 2000 年代初期,支持 KeyPreview 以帮助大量 VB6 程序员切换到 .NET。 KeyPreview 或 ProcessCmdKey() 的目的是让您的 UI 响应快捷键击。键盘消息通常发送到具有焦点的控件。 Windows 窗体消息循环允许代码在控件看到它之前先查看该消息。这对于快捷键很重要,为可能获得焦点以检测它们的每个控件实现 KeyDown 事件是非常不切实际的。

将 KeyPreview 设置为 True 不会导致问题。窗体的 KeyDown 事件将运行,只有当它具有对击键执行某些操作的代码时才会产生影响。但请注意,它紧跟 VB6 用法,您看不到用于导航的那种击键。与对话框的光标键和 Tab、Escape 和 Enter 类似。 ProcessCmdKey() 不是问题。

关于.net - 设置 Form.KeyPreview = true 的缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2386695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com