• SDK_按键消息的拦截


    按键消息的拦截

    • 拦截是为了在原有功能的基础上增加自己的操作

    • 扩展:当按钮接收到点击消息的时候,响应的是WM_LBUTTONDOWN消息,按钮的会被这个消息打包成一个WM_COMMAND 消息发送给父窗口,父窗口接收到之后再进行处理

    • 关键函数 SetWindowLong SetClassLong

      • 区别在于一个修改的是一个窗口,一个会影响到所有使用这个窗口类的窗口

      // 保存旧的按钮回调
      WNDPROC OldButtonProc = nullptr;

      // 用于处理接管到的消息的回调函数
      LRESULT CALLBACK ButtonProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
      {
      switch (uMsg)
      {
      // 1. 按钮作为一个窗口,需要响应 LBUTTONDOWN
      case WM_LBUTTONDOWN:
      {
      // 还原回调函数
      SetWindowLong(hWnd, GWL_WNDPROC, (LONG)OldButtonProc);
      MessageBox(hWnd, L"设置的处理函数", L"WM_LBUTTONDOWN", MB_OK);

      // 获取父窗口(不是重点)
      // HWND hParent = GetParent(hWnd);
      // PostMessage(hParent, WM_COMMAND, IDC_BUTTON1, (LPARAM)hWnd);
      break;
      }
      }


      // 为了保持原有功能不变,应该返回原按钮的回调函数
      return OldButtonProc(hWnd, uMsg, wParam, lParam);
      }

      // 对话框回调函数
      INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
      {
      switch (uMsg)
      {
      // 响应按钮的点击,修改回调函数
      case WM_COMMAND:
      {
      // 1. 修改【窗口】的回调函数
      // 参数1: 想要设置的窗口句柄
      // 参数2: 想要设置的类型 GWL
      // 参数3: 要替换的内容
      // 返回值是修改之前的数据
      OldButtonProc = (WNDPROC)SetWindowLong(
      (HWND)lParam, GWL_WNDPROC, (LONG)ButtonProc);

      // 默认的响应
      MessageBox(hWnd, L"默认的处理函数", L"WM_COMMAND", MB_OK);
      break;
      }

      case WM_CLOSE:
      {
      // 销毁对话框
      EndDialog(hWnd, 0);
      break;
      }

      default:
      break;
      }

      return FALSE;
      }

       

    动态库

  • 相关阅读:
    mysql5.7 慢查底里失败的原因
    单体架构知识点及单体架构的缺陷
    分布式事务精华总结篇
    Kafka 消息丢失与消费精确一次性
    分布式柔性事务之最大努力通知事务详解
    Kafka面试题——20道Kafka知识点
    分布式柔性事务之事务消息详解
    奈学:数据湖有哪些缺点?
    奈学:数据湖和数据仓库的区别有哪些?
    了解概率知识,概率作为机器学习的底层逻辑
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10910231.html
Copyright © 2020-2023  润新知