flutter 删除按Alt +组合键时的Windows错误/蜂鸣声

2guxujil  于 2023-02-05  发布在  Flutter
关注(0)|答案(1)|浏览(177)

我正在尝试从我的Flutter(Win32)应用程序中删除Windows错误声音。经过一些研究,我想出了这个fix。我尝试了这个修复,但它对我的Flutter应用程序没有帮助。
下面是处理WM_SYSCHAR消息的代码:

LRESULT CALLBACK Win32Window::WndProc(HWND const window,
                                      UINT const message,
                                      WPARAM const wparam,
                                      LPARAM const lparam) noexcept {
  if (message == WM_SYSCHAR) {
    std::cout << "SYSCHAR from win32" << std::endl;
    return 0;
  }
  ...
}

当我按下Alt+Space键时,控制台会显示“SYSCHAR from win32”。但每当我按下Alt键时,控制台不会显示此消息,而是播放Windows错误声音。看起来SYSCHAR消息在其他地方处理?
This可用于了解Flutter中Win32应用程序的工作和初始化。
我只是想告诉应用程序,Alt+键组合得到处理,它不必播放Windows错误声音。

oknrviil

oknrviil1#

感谢@IInspectable建议我使用keyboard accelerators
问题是Flutter的主循环没有键盘快捷键,所以我参考了如何使用键盘快捷键的文档,对主循环做了如下修改:
1.已通过调用CreateAcceleratorTable创建快捷键表

LPACCEL accels = GenerateAccels();
HACCEL haccel = CreateAcceleratorTable(accels, 36);
if (haccel==NULL) {
  return EXIT_FAILURE;
}

下面是GenerateAccels函数:

LPACCEL GenerateAccels() {
  LPACCEL lpAccel = new ACCEL[36];
  
  // Alt + Number combinations:
  for (int i = 0; i < 10; i++) {
    lpAccel[i].fVirt = FALT;
    lpAccel[i].key = (WORD)(0x30 + i);
  }

  // Alt + Alphabet combinations (NOT WORKING AT THE MOMENT):
  for (int i = 0; i < 26; i++) {
    lpAccel[i + 10].fVirt = FALT;
    lpAccel[i + 10].key = (WORD)(0x41 + i);
  }

  return lpAccel;
}

1.然后在主循环中添加对TranslateAccelerator的调用

::MSG msg = { };
while (::GetMessage(&msg, nullptr, 0, 0) > 0) {
  if (!TranslateAccelerator(msg.hwnd, haccel, &msg)) {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
}

1.我还添加了此检查,以防止在按下Alt后按下任何键时播放错误声音(Alt未被按住)。
flutter_window.cpp

case WM_SYSCOMMAND:
  // If the selection is in menu
  // handle the key event
  // This prevents the error/beep sound
  if (wparam == SC_KEYMENU) {
    return 0;
  }
  • 注意:有一个东西是不工作的Alt + Alphabet组合。当按下,它仍然播放错误的声音。在我的情况下,这并不重要,但如果有人找到修复,然后请分享。*

相关问题