gpt4 book ai didi

WinForms - 使用 ProcessCmdKey VS KeyDown 捕获按键组合

转载 作者:行者123 更新时间:2023-12-04 20:19:17 27 4
gpt4 key购买 nike

我的目标是实现自定义 Control + S 按键处理程序以连接到 winforms 应用程序中的自定义保存方法。

根据我的研发,有几种方法可以实现这一点。首先,我尝试了明显的 KeyPress 事件处理程序。这不足以捕获我需要的按键(它没有在编辑器级别调用,这正是我需要的)。

看起来更好的第二个选项是 protected 覆盖 bool ProcessCmdKey(ref Message msg, Keys keyData) 覆盖。这有效 - 它拦截了 CTRL 键单击,但显然我需要编写额外的代码来坚持按下 CTRL 键并拦截下一次按键(在我的情况下为 S)的事实,然后执行自定义操作。

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.S | Keys.Control))
{
// This is never called
}
else if (keyData == (Keys.Menu | Keys.Alt))
{
// this is called each time I hit CTRL
}
return true;
}

ProcessCmdKey 似乎在我按下 CTRL 键后立即被调用。

这篇文章建议创建一个 KeyTracker 类,该类将保留按下的键并执行它需要执行的操作:

Capture Key Sequence via ProcessCmdKey

这似乎是一个不错的选择,但在我深入研究纪念品跟踪模式之前,有没有人就如何完成这个看似常见的功能提出意见?

另一种模式使用 GetKeyboardState API 函数:

Capture multiple key downs in C#

这看起来很有趣,但我不确定它是否适合我的需求。
[DllImport ("user32.dll")]

public static extern int GetKeyboardState( byte[] keystate );
private void Form1_KeyDown( object sender, KeyEventArgs e )
{
byte[] keys = new byte[255];

GetKeyboardState (keys);

if( keys[(int)Keys.Up] == 129 && keys[(int)Keys.Right] == 129 )
{
Console.WriteLine ("Up Arrow key and Right Arrow key down.");
}
}

谢谢你看我的问题。

更新

我已经向我的 DataPanel 添加了三个用于键处理的事件。当我在事件中设置断点时,VS 没有接收到这些事件,所以这让我相信 ProcessCmdKey 是我最好的选择。

如果我能让这些事件发挥作用,那也很好:
        // Ctrl + S: Save Support
this.ParentForm.KeyPreview = true;
this.KeyPress += new KeyPressEventHandler(DataPanel_KeyPress);
this.KeyDown += new KeyEventHandler(DataPanel_KeyDown);
this.PreviewKeyDown += new PreviewKeyDownEventHandler(DataPanel_PreviewKeyDown);

按任何键时似乎都没有捕获这些事件:
void DataPanel_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == (Keys.S | Keys.Control))
{
SessionManager.Trace.AddTrace("You Hit Save!!");
}
}

void DataPanel_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == (Keys.S | Keys.Control))
{
SessionManager.Trace.AddTrace("You Hit Save!!");
}
}

void DataPanel_KeyPress(object sender, KeyPressEventArgs e)
{
var key = e.KeyChar;
}

更新

我已经通过使用一个简单的 KeyUp 事件和 KeyPreview 标志解决了这个问题:
 void ShipmentDataPanel_KeyUp(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.S)
{
MessageBox.Show("Control + S Key Hit!");
}
}

谢谢你。

最佳答案

设置 KeyPreview我们表单的属性为 true .此属性的摘要说:“获取或设置一个值,该值指示在将事件传递给具有焦点的控件之前,窗体是否将接收键事件。”。然后使用 KeyUp事件。除非 KeyPressed它还提供有关特殊键(如控制键)的信息。

关于WinForms - 使用 ProcessCmdKey VS KeyDown 捕获按键组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8459067/

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