好的,我试着尽快保持这一点。
在C#Winforms中,我有一个GUI窗口,显示数据网格视图和文本框。基本上我想要做的是,当按下向上箭头键或向下箭头键时,将此输入直接发送到datagridview以便在列表中上下移动。如果按下任何其他键,我想将此输入发送到我的文本框。
我尝试过度编写ProcessCmdKey方法并根据keyData键码设置焦点,但是第一次按键只会设置控制焦点,然后,第二次按键实际上会对焦点控制有效。我希望输入能够在没有一键延迟的情况下立即工作。
额外细节:
GUI类是泛型类。
希望这是有道理的!如果需要更多细节,我会编辑 谢谢!
答案 0 :(得分:3)
这很棘手,DataGridView很难修补。它具有ProcessUpKey()和ProcessDownKey()方法,但它们受到保护。您必须覆盖该类并添加公共方法,以便可以调用它们。您尝试做的事情失败了,因为当您收到键盘消息时,它已经被提交到具有焦点的窗口。
在没有对现有表单进行大的更改的情况下工作的一些狡猾的hackorama只是发布键盘消息,但这次使用DataGridView作为目标窗口。将此代码段粘贴到表单类中:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
if (msg.HWnd != dataGridView1.Handle && (keyData == Keys.Up || keyData == Keys.Down)) {
PostMessage(dataGridView1.Handle, msg.Msg, msg.WParam, msg.LParam);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);