zoukankan      html  css  js  c++  java
  • Win32 SDK消息处理技巧

     Win32 SDK中利用 DialogBox/DialogBoxParam 创建模态对话框一般行为是不处理WM_KEYDOWN消息的。

     非要处理可以子类化控件
     HANDLE hedit=GetDlgItem(hMainWnd,IDC_EDIT1);
     (WNDPROC)SetWindowLong(hedit, GWL_WNDPROC,(LONG)EditSubProc);


    如果该对话框中没有任何的子控件的话,在对话框的窗口回调函数DlgProc()中是可以过滤到WM_KEYDOWN消息的.

    不过并不是所有的键的消息都可以捕获到,例如像Tab键,上下左右方向键VK_UP/VK_DOWN/VK_LEFT/VK_RIGHT等都没有办法捕获到。

    如果该模态对话框中有子控件,哪怕是一个static静态文本控件的话,这个时候对话框的窗口回调函数中就无法获取任何的WM_KEYDOWN消息了。

    所以模态对话框在没有任何子控件的情况下想要处理Tab键/VK_UP/Down/Left/Rigth键的话,可以使用下面的方式:

    #include <windows.h>
    #include <stdio.h>
    #include "resource.h"

    extern BOOL CALLBACK DialogProc(HWND hMainWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {

     DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
     return 1;
    }
    BOOL CALLBACK DialogProc(HWND hMainWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
     char str1[MAX_PATH]="";
     HWND hwndTemp=NULL;
     HMENU hMenu=NULL;
     switch(uMsg)
     {
     case WM_KEYDOWN:
      MessageBox(0,0,0,0);
      break;

     case WM_CLOSE:
      ExitProcess(0);

      break;
     case WM_INITDIALOG:
      HANDLE hedit=GetDlgItem(hMainWnd,IDC_EDIT1);
      (WNDPROC)SetWindowLong(hedit, GWL_WNDPROC,(LONG)EditSubProc);
      break;
     }
     return 0;
    }
    LRESULT CALLBACK EditSubProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
     return 0;
    }
    //该对话框新的窗口回调函数,过滤WM_KEYDOWN消息。
    LRESULT CALLBACK NewDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
    {
     switch(message)
     {
      // 注意这里,否则没有办法捕获Tab/方向键
     case WM_GETDLGCODE:
      return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam));
     case WM_KEYDOWN:
      TCHAR szText[MAX_PATH] = {0};
      SetWindowText(hWnd, szText);
      break;
     default:
      break;
      return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
     }
    }

  • 相关阅读:
    【WPF】绘制柱状图、折线图、扇形图
    【WPF】获取容器宽高
    【SQL】SQL Server、MySQL、SQLite获取自增ID、自增ID清零
    【SQL Server操作】SQL Server重命名数据库及解决数据库无法分离的问题
    【数据迁移】MySQL数据库迁移到SQL Server
    【MySQL操作】MySQL导入导出数据库
    【MySQL操作】MySQL Workbench远程连接的一些操作
    【c#】遍历获得一个类的所有属性名
    vue 跨域 springCloud @CrossOrigin注解
    解决IDEA右侧maven不显示方法
  • 原文地址:https://www.cnblogs.com/mayingkun/p/4444293.html
Copyright © 2011-2022 走看看