zoukankan      html  css  js  c++  java
  • 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;
      }

       

    动态库

  • 相关阅读:
    Qt 4.x调试器问题,缺失调试助手。
    Qt 如何判断文件是不是一个目录
    Qt 5.7设置调试器
    Qt 无法解析外部文件2001,2019之类的
    TCP/UDP socket
    Qt 5.7 版本+2013VS环境配置
    骑行、318总结心得啊经验什么的
    蓝牙硬件交互数据传输Demo
    iOS蓝牙开发总结-4
    iOS蓝牙传输数据演示-3
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10910231.html
Copyright © 2011-2022 走看看