gpt4 book ai didi

c# - 当已经按下第二个键时如何检测键向下/向上

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:08 32 4
gpt4 key购买 nike

在我的应用程序中,我允许用户通过使用 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.正确) 正如我所期待的那样,但是 (Keys.Shift | Keys.ShiftKey)。然而,这个问题仍然可以通过 bool 值 keyRightDown 来解决。主要问题是,当用户通过此时仅按下 向右箭头 释放 Shift 键 时,没有其他调用 ProcessCmdKey 也不会触发 ProcessKeyMessage。我怎样才能实现我的目标?

最佳答案

我发现的唯一方法是结合调用 GetKeyState API 函数 (user32.dll) 和 Timer。这是它在测试应用程序上的运行情况:

System.Windows.Forms.Timer keyManagerTimer = new System.Windows.Forms.Timer();
int count = 0;

public Form1()
{
InitializeComponent();

this.keyManagerTimer.Tick += (s, e) => ProcessKeys();
this.keyManagerTimer.Interval = 25;
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if ((keyData & Keys.Right) != 0)
{
keyManagerTimer.Enabled = true;
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}

private void ProcessKeys()
{
bool isShiftKeyPressed = IsKeyPressed(Keys.ShiftKey);
bool isRightKeyPressed = IsKeyPressed(Keys.Right);

if (isRightKeyPressed && !isShiftKeyPressed)
{
count++;
}
else if (isRightKeyPressed && isShiftKeyPressed)
{
count += 10;
}
label.Text = "count = " + count.ToString();
}

public static bool IsKeyPressed(Keys key)
{
return BitConverter.GetBytes(GetKeyState((int)key))[1] > 0;
}

[DllImport("user32")]
private static extern short GetKeyState(int vKey);

然后在我的真实代码中,我在有视频的ControlLeave 事件上禁用了Timer。可能另一种解决方案是使用 IMessageFilter(请参阅 here)。

关于c# - 当已经按下第二个键时如何检测键向下/向上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314401/

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