【问题标题】:How to filter Alt key event for WM_DRAWITEM message如何过滤 WM_DRAWITEM 消息的 Alt 键事件
【发布时间】:2016-09-26 02:21:30
【问题描述】:

当我按下 Alt 键时,我在我的 win32 应用程序中收到 WM_DRAWITEM 消息,并导致重新绘制静态控件,这不是我需要的结果。我只需要在初始化时绘制控件。为什么我收到了 WM_DRAWITEM 消息?以及如何禁用 Alt 键?

【问题讨论】:

  • 您需要能够随时绘制该项目。例如,窗口可能会被最小化然后恢复,现在您需要重新绘制项目

标签: c++ windows user-interface


【解决方案1】:

您可以通过处理 WM_SYSCOMMAND 消息来检测是否从 Window 过程中按下了 Alt 键:

    case WM_SYSCOMMAND:

    if (wParam == SC_KEYMENU && (lParam >> 16) <= 0) // Alt key was pressed
        return 0;
    break;

【讨论】:

  • 按 Alt 将导致重绘以显示加速键。
  • 我的窗口(称为A窗口)包含在另一个窗口(称为B窗口)中,我可以在B窗口中得到WM_SYSCOMMAND消息,但在A窗口中不能,所以我不能过滤使用您发布的方法在 A 窗口中按 Alt 键。你知道如何在 A 窗口中获取 WM_SYSCOMMAND 消息吗?谢谢。
  • 您发布的方法会在整个应用程序中抑制 Alt 键,我怀疑它会有一些风险。可以只过滤WM_DRAWITEM消息响应函数中的Alt键吗?
  • 我只是在 SDI 上工作,所以我对 MDI 应用程序一无所知。 WM_DRAWITEM 不会向您发送按键向上/向下消息,因此您可以使用标志。只需在 Alt 键按下时设置一个标志,然后使用该标志来跳过控件的重绘。
  • 我可以在 WM_DRAWITEM 中获取 DRAWITEMSTRUCT,当我按下 Alt 键时,我发现结构中的 itemState 值为 4(ODS_DISABLED),但在初始化并移出时为 260(MSDN 上没有定义)/背屏。看来我可以通过检查 itemState 值来解决问题,但是我对这种方法不是很有信心。
猜你喜欢
  • 2013-02-25
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多