【发布时间】:2012-07-04 02:10:53
【问题描述】:
在我的应用程序中,我允许用户使用ProcessCmdKey 按住右箭头键 滚动电影。现在我想让用户能够在需要时增加滚动速度。理想情况下,用户应该能够按住右箭头键,然后当他决定提高速度时,他应该在不释放右箭头键的情况下同时按住Shift 键,当他决定恢复正常速度时,他只需松开 Shift 键。因此,滚动速度的差异应仅由 Shift 键 修饰符给出,该修饰符应添加或删除到 右箭头键 压力。
我尝试了这样的代码,但没有成功(在这个测试示例中,我的表单中有一个简单的标签):
int count = 0;
bool keyRightDown = false;
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Right)
{
keyRightDown = true;
count++;
label.Text = "count = " + count.ToString();
return true;
}
if (keyData == (Keys.Shift | Keys.ShiftKey) && keyRightDown)
{
count += 10;
label.Text = "count = " + count.ToString();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
protected override bool ProcessKeyMessage(ref Message m)
{
if ((Keys)m.WParam == Keys.Right)
{
if (m.Msg == 0x101) // KEYUP
{
keyDown = false;
return true;
}
}
return base.ProcessKeyMessage(ref m);
}
当用户将 Shift 键 添加到 右箭头 时,keyData 不包含我所期望的 (Keys.Shift | Keys.Right),而是包含 (Keys.Shift | Keys.ShiftKey)。但是这个问题仍然可以通过布尔值keyRightDown 来解决。主要问题是,当用户通过此时仅按下 右箭头 来释放 Shift 键 时,没有其他对 ProcessCmdKey 和 ProcessKeyMessage 的调用被触发。我怎样才能实现我的目标?
【问题讨论】:
-
只是猜测 - 是否可以在您的班级中按住“右箭头键向下”信息并检查当按下“shift”时这是否成立?您必须处理“key up”事件来重置该变量,但也许可以这样做?
-
是的,这是一个用于管理何时按下 Shift 键的选项,但我仍然无法检测到何时释放 Shift 键(同时始终按住右箭头)。我已经编辑了文本以包含您的解决方案
-
一些更多的研究倾向于让我假设你想做的事情是不可能的(以一种很好的方式)。一旦注册了 Shift 的 KeyUp,持续触发的 KeyDown 事件似乎确实停止了。我现在想到的一个问题是,为什么不简单地使用右箭头键以速度 x 前进,而使用 shift 键以速度 x * 10 前进?无论如何,您必须按多个键,这样您就不会花费太多时间来解决这个“并发按键”问题?