【问题标题】:Beeping while KeyDown is triggered触发 KeyDown 时发出蜂鸣声
【发布时间】:2018-11-29 09:03:46
【问题描述】:

我的表单上有一个TListView(它一直是焦点)和一个OnKeyDown 事件处理程序(它的KeyPreview 属性为真)。

playlist 是我的 TListView 组件 (Style = vsReport)。

void __fastcall Tmform::mformKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  if(Shift.Contains(ssCtrl))            // hotkeys with CTRL
  {
     switch(Key)
     {
        case vkF: findDoublesbtnClick(mform);  break;        // [FIND TWINS]
        case vkD: dbsClick(mform);             break;        // [DELETE BAD SONGS]
        case vkA: playlist->SelectAll();       break;        // [CTRL + A]
        case vkS: settingsClick(mform);        break;        // [SETTINGS]
     }
  }
  else                                  // just keys
  {
     switch(Key)
     {
        case vkReturn:  if(playlist->SelCount) pl.refreshSong();        break;   // [ENTER]
        case vkDelete:   af.deleteFiles();      break;        // [DELETE]
        case vkSpace:
        case vkNumpad3:  pl.playPauseResume();  break;
        case vkSubtract: prevbtnClick(mform);   break;        // [PREVIOUS]
        case vkAdd:      nextbtnClick(mform);   break;        // [NEXT]
        case vkC:        counterClick(mform);   break;        // [LISTENINGS WIN]
     }
}

为什么当我按下任意键(TListView 聚焦)时它会发出哔哔声?

【问题讨论】:

  • 有人能解释一下,为什么我的问题被否决了吗?
  • 因为您没有提供适当的详细信息。据我们所知,问题可能出在FormKeyDown 事件处理程序中的代码。这是我们看不到的。提供minimal reproducible example
  • 非常感谢。我会努力改正我的错误。
  • 我认为是因为列表处理了keydown事件(我猜默认方法是播放哔声),所以它没有被表单处理。所以我想你也需要在 listView 中捕获 keydown 并通过将其翻转到 keydown 方法来处理它。
  • 已经有一段时间了,但我似乎记得您可以通过在处理程序中将 Key 值设置为零来抑制哔声。

标签: c++ c++builder-10.2-tokyo


【解决方案1】:

所以,我发现,为什么它会发出哔哔声。这似乎是 TListView 组件的标准行为。选择TLISTVIEW中的一个项目(和TLISTVIEW有焦点),任何字符输入触发器“选择键入的项目”方法,试图通过我们的输入查找和选择项目。

这就是我感兴趣的答案。为了制作工作热键(包括一键),我使用了下一个代码:

void __fastcall TForm1::ListViewKeyPress(TObject *Sender, System::WideChar &Key)
{  Key = 0; }     // here TListView calls "find" method. I reset Key value,
                  // thus I have only vkCode for FormKeyDown which triggers
                  // after FormKeyPress
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
    if (Shift.Contains(ssAlt) && Key == vkF)                // use any key or shortcut
    {  Form1->Color = RGB(random(255), 0, 0);  return; }    // you wish
    if (Key == vkF)
       Form1->Color = RGB(0, random(255), 0);
    if (Key == vkSpace)
       Form1->Color = RGB(0, 0, random(255));
}

它适用于所有现有的 PC 键盘布局。但是使用 'alt' 和 'win' 键仍然会发出哔哔声,因为任何键 使用 'alt' 或 'win' 不会触发 ListViewKeyPress 事件。

感谢您的帮助!

【讨论】:

  • OnKey... 事件中将Key 参数设置为0 是在击键到达ListView 之前丢弃击键的正确且有记录的方法。尝试使用OnKeyPress 而不是OnKeyDown
  • 我无法使用Key = 0。如果输入语言可以不同,那么如何在OnKeyPress 中处理它,因此字符不同?附言要听到哔声,我选择任何项目并等待大约 1 秒。如果按得更快,则不会出现哔声。
  • 当您按下与列表项的第一个字母不匹配的键时会发出哔声。当我在OnKeyDown 中将Key 设置为0 时,它会抑制大多数 的哔哔声。只有在 ListView 选择更改后才会发出哔哔声。第一次按下蜂鸣声,随后的蜂鸣声被抑制,直到选择再次更改。但是在OnKeyPress 中将Key 设置为0 会抑制所有 的哔哔声。
  • 使用OnKeyPress 可以正常工作,这就是我想要的结果。那么如何使它适用于多种语言呢?
  • 您显示的代码未使用任何与语言相关的字符。但是,如果需要,您可以在想要禁止/允许给定字符时设置/清除 OnKeyDown 中的标志,清除 OnKeyUp 中的标志,如果标志为设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多