• 零基础逆向工程32_Win32_06_通用控件_VM_NOTIFY


    标准控件与可用控件

    windows标准控件,标准控件总是可用的

    Static
    Group Box
    Button
    Check Box
    Radio Button
    Edit
    ComboBox
    ListBox

    Windows通用控件,代码包含在Comctrl32.dll

    以下列出通用控件

    Animation
    ComboBoxEx
    Date_and_Time_Picker
    Drag_List_Box
    Flat_Scroll_Bar
    Header
    HotKey
    ImageList
    IPAddress
    List_View
    Month_Calendar
    Pager
    Progress_Bar
    Property_Sheets
    Rebar
    Status Bars
    SysLink
    Tab
    Toolbar
    ToolTip
    Trackbar
    TreeView
    Up_and_Down

    通用控件使用方法

    #include <commctrl.h>
    #pragma comment(lib,"comctl32.lib")
    
    //通用控件在使用前,需要通过INITCOMMONCONTROLSEX进行初始化
    
    //只要在您的程序中的任意地方引用了该函数就、会使得WINDOWS的程序加载器PE Loader加载该库
    
    INITCOMMONCONTROLSEX icex;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    icex.dwICC = ICC_WIN95_CLASSES;
    InitCommonControlsEx(&icex);
    
    

    ListView的使用

    初始化列名信息

    LV_COLUMN lv;
    HWND hListProcess;
    
    //初始化
    memset(&lv,0,sizeof(LV_COLUMN));
    //获取IDC_LIST_PROCESS句柄
    hListProcess = GetDlgItem(hDlg,IDC_LIST_PROCESS);
    //设置整行选中
    SendMessage(hListProcess,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
    
    //第一列
    lv.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
    lv.pszText = TEXT("进程");
    lv.cx = 200;
    lv.iSubItem = 0;
    //ListView_InsertColumn(hListProcess, 0, &lv);
    SendMessage(hListProcess,LVM_INSERTCOLUMN,0,(DWORD)&lv);
    //第二列
    lv.pszText = TEXT("PID");
    lv.cx = 100;
    lv.iSubItem = 1;
    //ListView_InsertColumn(hListProcess, 1, &lv);
    SendMessage(hListProcess,LVM_INSERTCOLUMN,1,(DWORD)&lv);
    //第三列
    lv.pszText = TEXT("镜像基址");
    lv.cx = 100;
    lv.iSubItem = 2;
    ListView_InsertColumn(hListProcess, 2, &lv);
    //第四列
    lv.pszText = TEXT("镜像大小");
    lv.cx = 100;
    lv.iSubItem = 3;
    ListView_InsertColumn(hListProcess, 3, &lv);
    
    

    向列表中新增数据

    LV_ITEM vitem;
    
    //初始化
    memset(&vitem,0,sizeof(LV_ITEM));
    vitem.mask = LVIF_TEXT;
    
    vitem.pszText = "csrss.exe";
    vitem.iItem = 0;
    vitem.iSubItem = 0;
    //ListView_InsertItem(hListProcess, &vitem);
    SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);
    
    vitem.pszText = TEXT("448");
    vitem.iItem = 0;
    vitem.iSubItem = 1;
    ListView_SetItem(hListProcess, &vitem);
    
    vitem.pszText = TEXT("56590000");
    vitem.iItem = 0;
    vitem.iSubItem = 2;
    ListView_SetItem(hListProcess, &vitem);
    
    vitem.pszText = TEXT("000F0000");
    vitem.iItem = 0;
    vitem.iSubItem = 3;
    ListView_SetItem(hListProcess, &vitem);
    
    vitem.pszText = TEXT("winlogon.exe");
    vitem.iItem = 1;
    vitem.iSubItem = 0;
    //ListView_InsertItem(hListProcess, &vitem);
    SendMessage(hListProcess, LVM_INSERTITEM,0,(DWORD)&vitem);
    
    vitem.pszText = TEXT("456");
    vitem.iSubItem = 1;
    ListView_SetItem(hListProcess, &vitem);
    
    vitem.pszText = TEXT("10000000");
    vitem.iSubItem = 2;
    ListView_SetItem(hListProcess, &vitem);
    
    vitem.pszText = TEXT("000045800");
    vitem.iSubItem = 3;
    ListView_SetItem(hListProcess, &vitem);
    
    

    WM_NOTIFY消息类型

    WM_NOTIFY的使用:

    该消息类型与WM_COMMAND类型相似,都是由子窗口向父窗口发送的消息。

    WM_NOTIFY可以包含比WM_COMMAND更丰富的信息

    Windows通用组件中有很多消息,都是通过WM_NOTIFY来描述的.

    WM_NOTIFY消息中的参数如下:

    wParam:控件ID
    
    lParam:指向一个结构
    
    typedef struct tagNMHDR { 
            HWND hwndFrom; //发送通知消息的控制窗口句柄
            UINT idFrom;   //发送通知消息的控制ID值
            UINT code;     //通知码,如LVM_SELCHANGED
        } NMHDR; 
    
    

    此结构体能满足一般的要求,但能描述的信息还是有限的

    解决方案:对每种不同用途的通知消息都定义另一种结构来表示

    typedef struct tagNMLVCACHEHINT {
        NMHDR   hdr;
        int     iFrom;
        int     iTo;
    } NMLVCACHEHINT, *PNMLVCACHEHINT;
    
    typedef struct tagLVDISPINFO {
        NMHDR hdr;
        LVITEM item;
    } NMLVDISPINFO, FAR *LPNMLVDISPINFO;
    
    typedef struct _NMLVFINDITEM {
        NMHDR hdr;
        int iStart;
        LVFINDINFO lvfi;
    } NMLVFINDITEM, *PNMLVFINDITEM;
    
    
  • 相关阅读:
    五大Java开源论坛
    mysql limit,offset 区别
    查询某个字段存在于哪几个表
    C++分享笔记:5X5单词字谜游戏设计
    Linux分享笔记:系统状态检测命令小结
    Linux分享笔记:查看帮助命令 & 常用系统工作命令
    数据结构(C语言)分享笔记:数据结构的逻辑层次、存储层次
    Linux分享笔记:shell终端的介绍
    Java开发学生管理系统
    JAVA使用JDBC连接,修改MySQL数据库(比较乱)
  • 原文地址:https://www.cnblogs.com/flatcc/p/7797524.html
Copyright © 2020-2023  润新知