【问题标题】:Handling Single Key Presses, Multiple Times处理单次按键,多次
【发布时间】:2013-09-23 18:27:07
【问题描述】:

在有人说之前有人问过这个问题之前,我今天花了整整 2 个小时在 Google 中尝试不同的措辞,希望能找到答案,但没有什么是我想要的。我发现的大部分内容都是使用诸如“CTRL + A”之类的组合键来处理的,而这不是我要在这里尝试的。

我的任务是创建一个外观和弹奏钢琴的应用程序。到目前为止,我已经将它设置为当您单击按钮(钢琴键)时,它会播放特定频率(使用“Kernel32”库中的Beep 函数?)

现在,我想做的是按 A、D 和 G 之类的键,同时弹奏一个和弦,这将转化为音符 C、E 和 G。

我尝试做的是将所有内容放在KeyPress 子目录下。

Sub frmForm1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles Me.KeyPress
        If Keys.A Then
            C_KeyPress()
        End If

        If Keys.S Then
            D_KeyPress()
        End If
    End Sub

但是当我按下 A(或本例中的 S 键)时,即使我只按下 A 键,它也会执行两个 If 语句。我不知道如何制作它,以便它只播放我分配该键的特定音符。

(我不确定这是否需要进入另一个问题,但是,我将如何一次处理 3 个

【问题讨论】:

标签: vb.net keypress


【解决方案1】:

您正在测试Keys.<something> 值,而不是将其与实际按键数据进行比较。 KeyPress 只给出按下的字符,但你可以用它做一些逻辑。例如:

If Char.ToLower(e.KeyChar) = Char.ToLower(ChrW(Keys.A)) Then
    C_KeyPress()
End If

【讨论】:

  • 当我使用那个 sn-p 时,它现在只有在你按下 shift 来获取大写 A 时才会起作用。如何在不按下 shift 的情况下让它工作?
  • 比较时通过 String.UCase() 传递它们
  • @DanVerdolino 谢谢,补充说(但改用Char.ToLower)-
【解决方案2】:

你可以

  1. 将所有键标记为向上

  2. 使用按键按下事件在每个按键按下时将其标记为“按下”

  3. 使用向上键甚至可以在每个键向上时将其重新标记为“向上”

  4. 有一个计时器循环,在每个滴答声中根据当时标记为“按下”的键来决定播放哪种声音

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多