- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只要按住箭头键,我就需要执行某种方法。现在,对于 Visual Studio 2012 中的常规箭头键按下,使用 OnKeyDown
不起作用,所以我需要使用 ProcessCmdKey
,这就像一个魅力。有没有办法使用ProcessCmdKey
检测箭头何时被释放/被按住?
我采纳了马库斯和汉斯的建议,并将这两种想法结合起来。我用了ProcessKeyPreview
方法,但我仍然遇到一些问题。当我按住任意箭头键时,此方法不会检测到 WM_KEYDOWN
已经发生了......但是当我从按键上松开手指时,它实际上确实注意到 WM_KEYUP
已经发生了。
有趣的是,当我按住任何其他键(即字母“S”)时,它会正确识别何时按下并释放。我在下面发布了我的代码片段:
const int WM_KEYUP = 0x0101;
const int WM_KEYDOWN = 0x0100;
protected override bool ProcessKeyPreview(ref Message m)
{
int msgVal = m.WParam.ToInt32();
if (m.Msg == WM_KEYDOWN)
{
switch ((Keys)msgVal) {
case Keys.Down:
Console.WriteLine("down pressed"); //not detected
break;
case Keys.S:
Console.WriteLine("S pressed!"); //detected
break;
}
}
if (m.Msg == WM_KEYUP)
{
switch ((Keys)msgVal)
{
case Keys.Down:
Console.WriteLine("down released"); //detected
break;
case Keys.S:
Console.WriteLine("s released!"); //detected
break;
}
}
return base.ProcessKeyPreview(ref m);
}
最佳答案
您无法使用 ProcessCmdKey() 看到 KeyUp 事件,它只能处理 KeyDown 事件。如果表单包含控件,您将需要在低得多的级别上解决这个问题。诀窍是在 Winforms 通过正常的键处理和 WndProc 链发送消息之前拦截该消息。这需要实现 IMessageFilter 接口(interface)。像这样:
public partial class Form1 : Form, IMessageFilter { // NOTE: added IMessageFilter
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
}
protected override void OnFormClosed(FormClosedEventArgs e) {
Application.RemoveMessageFilter(this);
base.OnFormClosed(e);
}
bool IMessageFilter.PreFilterMessage(ref Message m) {
// Trap WM_KEYUP/DOWN for Keys.Down key
if ((m.Msg == 0x100 || m.Msg == 0x101) && (Keys)m.WParam.ToInt32() == Keys.Down) {
bool repeat = (m.LParam.ToInt32() & (1 << 30)) != 0;
bool down = m.Msg == 0x100;
// But only for this form
Form form = null;
var ctl = Control.FromHandle(m.HWnd);
if (ctl != null) form = ctl.FindForm();
if (form == this) {
OnCursorDown(down, repeat & down);
return true;
}
}
return false;
}
private void OnCursorDown(bool pressed, bool repeat) {
// etc..
}
}
关于c# - 使用 ProcessCmdKey 按住箭头键按下事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24315897/
我正在使用下面提到的代码来捕获按下的键。我之前在其他解决方案中使用过它并且在那里工作正常。但是现在显示错误 Inconsistent accessibility: parameter type 're
我试图在一个小测试 Windows 窗体应用程序上获得一些键盘响应,我有一个粗略的解决方案,即覆盖 ProcessCmdKey。但是,我遇到了几个问题,并且发现了不一致之处。 不同的事件:有没有办法在
只要按住箭头键,我就需要执行某种方法。现在,对于 Visual Studio 2012 中的常规箭头键按下,使用 OnKeyDown不起作用,所以我需要使用 ProcessCmdKey ,这就像一个魅
我的代码: using System.Windows.Forms class Class1 { protected override bool ProcessCmdKey (ref
我有覆盖 TextBox ProcessCmdKey 方法的代码: protected override bool ProcessCmdKey(ref Message msg, Keys keyDat
我在 WinForms 应用程序中遇到以下问题。我正在尝试实现热键,我需要在控件处于事件状态时处理键消息,无论焦点是否位于该控件内的文本框等。 覆盖 ProcessCmdKey 对此非常有效,并且完全
识别击键是否为可打印字符(应出现在文本框中的字符)的最简单方法是什么?我想将 F1、Home 等键与实际出现在文本框中的键分开。我试图通过自己识别所有不可打印的字符来避免大量的 IF 语句。 由于控件
我是 WPF 新手,在 WinForms 中向我经常使用的表单添加热键 ProcessCmdKey这使得重写(添加)关键相关功能变得容易(类似于here描述的方式)。有没有一种简单的方法可以在 WPF
识别击键是否为可打印字符(应出现在文本框中的字符)的最简单方法是什么?我想将 F1、Home 等键与实际出现在文本框中的键分开。我试图通过自己识别所有不可打印的字符来避免大量的 IF 语句。 由于控件
我有一个简单的 Windows 窗体 应用程序,它只不过是一个包含 WebBrowser 的 Form。 我正在覆盖 ProcessCmdKey方法,效果很好。但是,虽然 WebBrowser 获得了
我的目标是实现自定义 Control + S 按键处理程序以连接到 winforms 应用程序中的自定义保存方法。 根据我的研发,有几种方法可以实现这一点。首先,我尝试了明显的 KeyPress 事件
所以我不得不覆盖 ProcessCmdKey 以检测我的 winform 中的制表符按下。参见 this上下文问题。现在我已经成功解决了我遇到的制表问题,我现在意识到我还需要检查 shift+tab
我有一个 WinForms 窗体,它曾经是一个独立的应用程序,但现在正在作为更大的 WPF 应用程序的一部分启动。它仍然是一个单独的窗口,不包含在 WPF 窗口中。我看到的问题是窗口中的 Proces
我是一名优秀的程序员,十分优秀!