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;
      }

       

    动态库

  • 相关阅读:
    WebForm中使用MVC
    CPAN镜像使用帮助
    关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation
    XML之命名空间的作用(xmlns)
    xml相关术语说明
    .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门
    BZOJ3734 : [Ontak2013]Miny
    BZOJ3448 : [Usaco2014 Feb]Auto-complete
    BZOJ3476 : [Usaco2014 Mar]The Lazy Cow
    BZOJ3619 : [Zjoi2014]璀灿光华
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10910231.html
Copyright © 2011-2022 走看看