Windows GUI编程指南

admin 2024年10月15日13:11:02评论19 views字数 29279阅读97分35秒阅读模式

关注并星标🌟 一起学安全❤️

作者:coleak  

首发于公号:渗透测试安全攻防 

字数:27879

声明:仅供学习参考,请勿用作违法用途

目录

  • SDK

  • MFC

  • reference

SDK

按钮

#include <Windows.h>
#include "resource.h"

#define ID_BUTTON_PUSH1     1
#define ID_BUTTON_PUSH2     11
#define ID_BUTTON_PUSH3     111
#define ID_BUTTON_PUSH4     222
#define ID_BUTTON_PUSH5     333
#define ID_BUTTON_CHECKBOX1    2
#define ID_BUTTON_RADIOBUTTON1   3
#define ID_BUTTON_RADIOBUTTON2   4

HINSTANCE ghInstance = 0;

LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 ghInstance = hInstance;

 // 注册窗口
 WNDCLASSEX wndclass = { 0 };
 wndclass.cbSize = sizeof(WNDCLASSEX);
 wndclass.style = NULL;
 wndclass.lpfnWndProc = MainWindowProc;
 wndclass.cbClsExtra = NULL;
 wndclass.cbWndExtra = NULL;
 wndclass.hInstance = hInstance;
 wndclass.hIcon = NULL;
 wndclass.hCursor = NULL;
 wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;
 wndclass.lpszMenuName = NULL;
 wndclass.lpszClassName = TEXT("0xCC");
 wndclass.hIconSm = NULL;

 if (!RegisterClassEx(&wndclass))
 {
  MessageBox(NULL, TEXT("RegisterClassEx Failed"), TEXT("Error"), MB_OK);
  return 1;
 }

 // 创建窗口
 HWND hwnd = CreateWindowEx(
  WS_EX_CLIENTEDGE,
  TEXT("0xCC"),
  TEXT("CreateWindowEx"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  960,
  540,
  NULL,
  NULL,
  hInstance,
  NULL
 );

 if (hwnd == NULL)
 {
  MessageBox(NULL, TEXT("CreateWindowEx Failed"), TEXT("Error"), MB_OK);
  return 1;
 }

 // 显示窗口
 ShowWindow(hwnd, SW_SHOWDEFAULT);

 // 更新窗口
 UpdateWindow(hwnd);

 // 消息处理
 MSG msg = { 0 };
 while (GetMessage(&msg, 000))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }


 return 0;
}

// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 static HWND hButton1, hButton2, hButton3, hButton4, hButton5, hCheck, hRADIOBUTTON1, hRADIOBUTTON2;
 switch (uMsg)
 {
 case WM_CREATE:
 {
  //创建控件
  hButton1 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON1"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   1010,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH1,
   ghInstance,
   NULL);

  hButton2 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON2"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   17010,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH2,
   ghInstance,
   NULL);

  hButton3 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON3"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP,
   33010,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH3,
   ghInstance,
   NULL);

  hButton4 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON4"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   17060,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH4,
   ghInstance,
   NULL);

  hButton5 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON5"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   33060,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH5,
   ghInstance,
   NULL);

  hCheck = CreateWindow(
   TEXT("BUTTON"),
   TEXT("CHECKBOX"),
   WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
   1060,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_CHECKBOX1,
   ghInstance,
   NULL);

  hRADIOBUTTON1 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("RADIOBUTTON1"),
   WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
   10110,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_RADIOBUTTON1,
   ghInstance,
   NULL);

  hRADIOBUTTON2 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("RADIOBUTTON2"),
   WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
   10160,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_RADIOBUTTON2,
   ghInstance,
   NULL);

  //初始控件
  SendMessage(hCheck, BM_SETCHECK, BST_UNCHECKED, 0);
  SendMessage(hRADIOBUTTON1, BM_SETCHECK, BST_CHECKED, 0);
  HBITMAP hBitmap = LoadBitmap(ghInstance, MAKEINTRESOURCE(IDB_BITMAP1));
  //HBITMAP hBitmap = LoadBitmap((HINSTANCE)GetWindowLongPtr(hwnd, GWLP_HINSTANCE), MAKEINTRESOURCE(IDB_BITMAP1));
  if (hBitmap != NULL)
  {
   SendMessage(hButton3, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBitmap);
  }
  break;
 }
 case WM_DESTROY:
 {
  PostQuitMessage(0);
  break;
 }
 case WM_COMMAND:
 {
  switch (LOWORD(wParam))
  {
  case ID_BUTTON_PUSH1:
  {
   MessageBox(NULL, TEXT("ID_BUTTON_PUSH1"), NULLNULL);
   break;
  }
  case ID_BUTTON_PUSH2:
  {
   SendMessage(hButton1, BM_CLICK, 00);
   break;
  }
  case ID_BUTTON_CHECKBOX1:
  {
   BOOL ret = SendMessage(hCheck, BM_GETCHECK, 00) == BST_CHECKED;
   HWND hChe = GetDlgItem(hwnd, ID_BUTTON_CHECKBOX1);
   SendMessage(hChe, BM_SETCHECK, ret ? BST_UNCHECKED : BST_CHECKED, 0);
   break;
  }
  case ID_BUTTON_RADIOBUTTON1:
  case ID_BUTTON_RADIOBUTTON2:
  {
   SendMessage(hRADIOBUTTON1, BM_SETCHECK, BST_UNCHECKED, 0);
   SendMessage(hRADIOBUTTON2, BM_SETCHECK, BST_UNCHECKED, 0);
   SendMessage((HWND)lParam, BM_SETCHECK, BST_CHECKED, 0);
   //SendMessage(GetDlgItem(hwnd, LOWORD(wParam)), BM_SETCHECK, BST_CHECKED, 0);
   break;
  }
  case ID_BUTTON_PUSH5:
  {
   SendMessage(hButton4, BM_SETSTYLE, BS_CHECKBOX, TRUE);
   break;
  }

  }
 }
 default:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
 }

}

主窗口:RegisterClassEx(WNDCLASSEX)、CreateWindowEx、ShowWindow、UpdateWindow

消息循环:GetMessage、TranslateMessage、DispatchMessage

窗口处理:switch (uMsg)->WM_COMMAND、WM_DESTROY、WM_CREATE…

控件创建:CreateWindow、控件样式、控件标识

控件通信:SendMessage->BM_SETCHECK、BM_GETCHECK、BM_CLICK…

加载位图:LoadBitmap(MAKEINTRESOURCE)、SendMessage

控件定位:WM_COMMAND->LOWORD(wParam)

编辑框

#include <Windows.h>
#include "resource.h"

#define ID_EDIT_SINGLELINE   1
#define ID_EDIT_MULTILINE   2
#define ID_EDIT_PASSWORD   3
#define ID_EDIT_READONLY   4


HINSTANCE ghInstance = 0;

LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
 static HWND hEditLine, hMultiple, hPassWord, hReadOnly;

 switch (uMsg)
 {
 case WM_CREATE:
 {
  //创建控件

  hEditLine = CreateWindow(
   TEXT("EDIT"),
   NULL,
   WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT,
   101020025,
   hwnd,
   HMENU(ID_EDIT_SINGLELINE),
   ghInstance,
   NULL);

  hMultiple = CreateWindow(
   TEXT("EDIT"),
   NULL,
   WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
   1050200100,
   hwnd,
   HMENU(ID_EDIT_MULTILINE),
   ghInstance,
   NULL);

  hPassWord = CreateWindow(
   TEXT("EDIT"),
   NULL,
   WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_PASSWORD,
   1016520025,
   hwnd,
   HMENU(ID_EDIT_PASSWORD),
   ghInstance,
   NULL);

  hReadOnly = CreateWindow(
   TEXT("EDIT"),
   TEXT("ES_READONLY"),
   WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_READONLY,
   1020520025,
   hwnd,
   HMENU(ID_EDIT_READONLY),
   ghInstance,
   NULL);

  // 初始控件

  // 设置文本
  //SendMessage(hEditLine, WM_SETTEXT, 0, (LPARAM)TEXT("Hello World"));

  // 获取文件
  //TCHAR szBuffer[0xFF] = { 0 };
  //SendMessage(hEditLine, WM_GETTEXT, 0xFF, (LPARAM)szBuffer);

  // 获取长度
  //DWORD dwLength = SendMessage(hEditLine, WM_GETTEXTLENGTH, 0, 0);

  // 设置风格
  //SendMessage(hEditLine, EM_SETREADONLY, TRUE, 0);


  break;
 }
 case WM_DESTROY:
 {
  PostQuitMessage(0);
  break;
 }
 case WM_COMMAND:
 {
  switch (HIWORD(wParam))
  {
  case EN_CHANGE:
  {
   if (LOWORD(wParam) == ID_EDIT_SINGLELINE)
   {
    TCHAR szBuffer[0xFF] = { 0 };
    SendMessage(hEditLine, WM_GETTEXT, 0xFF, (LPARAM)szBuffer);
    OutputDebugString(szBuffer);
   }
  }

  //case EN_SETFOCUS:
  //{
  // if (LOWORD(wParam) == ID_EDIT_MULTILINE)
  // {
  //  MessageBox(0, TEXT("EN_SETFOCUS"), 0, 0);
  // }
  // break;
  //}
  case EN_KILLFOCUS:
  {
   if (LOWORD(wParam) == ID_EDIT_MULTILINE)
   {
    OutputDebugString(L"EN_KILLFOCUS");
   }
   break;
  }
  break;
  }
 }
 default:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
 }
}

编辑框类型:READONLY、PASSWORD、MULTILINE、SINGLELINE…

文本检索:WM_GETTEXT、WM_SETTEXT、WM_GETTEXTLENGTH

操作:HIWORD(wParam)->EN_CHANGE、EN_SETFOCUS、EN_KILLFOCUS…

组合框

#include <Windows.h>
#include "resource.h"

#define ID_BUTTON_PUSH1    11
#define ID_CB_DROPDOWN    1
#define ID_CB_DROPDOWNLIST   2


HINSTANCE ghInstance = 0;

LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

 switch (uMsg)
 {
 case WM_CREATE:
 {
  HWND hButton1 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON1"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   10250,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH1,
   ghInstance,
   NULL);

  HWND hDropDown = CreateWindow(
   TEXT("COMBOBOX"),
   NULL,
   WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
   1010200200,
   hwnd,
   HMENU(ID_CB_DROPDOWN),
   ghInstance,
   NULL);

  HWND hDropList = CreateWindow(
   TEXT("COMBOBOX"),
   NULL,
   WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
   25010200200,
   hwnd,
   HMENU(ID_CB_DROPDOWNLIST),
   ghInstance,
   NULL);

  break;
 }
 case WM_COMMAND:
 {
  switch (LOWORD(wParam))
  {
  case ID_BUTTON_PUSH1:
  {
   // 添加表项
   SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWN), CB_ADDSTRING, 0, (LPARAM)TEXT("大雁塔"));
   SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWN), CB_ADDSTRING, 0, (LPARAM)TEXT("小雁塔"));

   SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_ADDSTRING, 0, (LPARAM)TEXT("东海龙宫"));
   SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_ADDSTRING, 0, (LPARAM)TEXT("长安城"));

   // 删除表项
   CB_DELETESTRING;

   // 设置表项
   SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWN), CB_SETCURSEL, 00);
   SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_SETCURSEL, 00);

   // 清空表项
   CB_RESETCONTENT;

   break;
  }

  }

  switch (HIWORD(wParam))
  {
  case CBN_SELCHANGE:
  {
   if (LOWORD(wParam) == ID_CB_DROPDOWNLIST)
   {
    DWORD dwIndex = SendMessage((HWND)lParam, CB_GETCURSEL, 00);
    TCHAR szBuffer[0xff] = { 0 };
    SendMessage((HWND)lParam, CB_GETLBTEXT, dwIndex, (LPARAM)szBuffer);
    MessageBox(hwnd, szBuffer, 00);
    break;
   }
  }

  case CBN_DROPDOWN:
  {
   if (LOWORD(wParam) == ID_CB_DROPDOWNLIST)
   {
    // 清空数据
    SendMessage((HWND)lParam, CB_RESETCONTENT, 00);

    // 获取数据
    DWORD dwIndex = SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWN), CB_GETCURSEL, 00);
    TCHAR szBuffer[0xff] = { 0 };
    SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWN), CB_GETLBTEXT, dwIndex, (LPARAM)szBuffer);

    /*设置数据*/
     if (wcscmp(szBuffer, TEXT("小雁塔")) == 0)
     {

      SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_ADDSTRING, 0, (LPARAM)TEXT("毛毛虫1"));
      SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_ADDSTRING, 0, (LPARAM)TEXT("毛毛虫2"));

     }
     else
     {

      SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_ADDSTRING, 0, (LPARAM)TEXT("羊头怪1"));
      SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_ADDSTRING, 0, (LPARAM)TEXT("羊头怪1"));

     }

   }


   break;
  }

  }

  break;
 }
 case WM_DESTROY:
 {
  PostQuitMessage(0);
  break;
 }
 default:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
 }

}

组合框类型:CBS_DROPDOWN(可以手动输入)、CBS_DROPDOWNLIST(不可编辑)

操作捕获:HIWORD(wParam)->CBN_SELCHANGE(选中)、CBN_DROPDOWN(下拉可见前)

控件通信:SendMessage->CB_GETCURSEL、CB_GETLBTEXT、CB_RESETCONTENT、CB_ADDSTRING

CB_ADDSTRING后紧跟CB_SETCURSEL设置列表项

窗口类

GetClassInfoEx、UnregisterClass

#include <Windows.h>
#include "resource.h"

#define ID_BUTTON_PUSH1  11
#define ID_LB_LIST1   1
#define ID_LB_LIST2   2

HINSTANCE ghInstance = 0;

LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 ghInstance = hInstance;

 // 注册窗口
 WNDCLASSEX wndclass = { 0 };
 wndclass.cbSize = sizeof(WNDCLASSEX);
 wndclass.style = NULL;
 wndclass.lpfnWndProc = MainWindowProc;
 wndclass.cbClsExtra = NULL;
 wndclass.cbWndExtra = NULL;
 wndclass.hInstance = hInstance;
 wndclass.hIcon = NULL;
 wndclass.hCursor = NULL;
 wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;
 wndclass.lpszMenuName = NULL;
 wndclass.lpszClassName = TEXT("0xCC");
 wndclass.hIconSm = NULL;

 if (!RegisterClassEx(&wndclass))
 {
  MessageBox(NULL, TEXT("RegisterClassEx Failed"), TEXT("Error"), MB_OK);
  return 1;
 }

 // 创建窗口
 HWND hwnd = CreateWindowEx(
  WS_EX_CLIENTEDGE,
  TEXT("0xCC"),
  TEXT("CreateWindowEx"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  960,
  540,
  NULL,
  NULL,
  hInstance,
  NULL
 );

 //创建失败
 if (hwnd == NULL)
 {
  MessageBox(NULL, TEXT("CreateWindowEx Failed"), TEXT("Error"), MB_OK);
  WNDCLASSEX wndOut = { 0 };
  wndOut.cbSize = sizeof(WNDCLASSEX);
  BOOL bRet = GetClassInfoEx(hInstance, L"0xCC", &wndOut);//查找窗口类
  if (bRet)
  {
   UnregisterClass(L"0xCC", hInstance);//取消注册类
  }
  return 1;
 }

 // 显示窗口
 ShowWindow(hwnd, SW_SHOWDEFAULT);

 // 更新窗口
 UpdateWindow(hwnd);

 // 消息处理
 MSG msg = { 0 };
 while (GetMessage(&msg, 000))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }


 return 0;
}

// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

 switch (uMsg)
 {
 case WM_DESTROY:
 {
  PostQuitMessage(0);
  break;
 }
 default:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
 }

}

FindWindow、FindWindowEx、GetWindowLongPtr、GetWindowText、SetWindowText、RedrawWindow

#include <Windows.h>
#include "resource.h"

#define ID_BUTTON_PUSH1  11

HINSTANCE ghInstance = 0;

LRESULT CALLBACK MainWindowProc(HWND, UINT, WPARAM, LPARAM);

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
 ghInstance = hInstance;

 // 注册窗口
 WNDCLASSEX wndclass = { 0 };
 wndclass.cbSize = sizeof(WNDCLASSEX);
 wndclass.style = NULL;
 wndclass.lpfnWndProc = MainWindowProc;
 wndclass.cbClsExtra = NULL;
 wndclass.cbWndExtra = NULL;
 wndclass.hInstance = hInstance;
 wndclass.hIcon = NULL;
 wndclass.hCursor = NULL;
 wndclass.hbrBackground = (HBRUSH)COLOR_WINDOW;
 wndclass.lpszMenuName = NULL;
 wndclass.lpszClassName = TEXT("0xCC");
 wndclass.hIconSm = NULL;

 if (!RegisterClassEx(&wndclass))
 {
  MessageBox(NULL, TEXT("RegisterClassEx Failed"), TEXT("Error"), MB_OK);
  return 1;
 }

 // 创建窗口
 HWND hwnd = CreateWindowEx(
  WS_EX_CLIENTEDGE,
  TEXT("0xCC"),
  TEXT("coleak"),
  WS_OVERLAPPEDWINDOW,
  CW_USEDEFAULT,
  CW_USEDEFAULT,
  960,
  540,
  NULL,
  NULL,
  hInstance,
  NULL
 );

 //创建失败
 if (hwnd == NULL)
 {
  MessageBox(NULL, TEXT("CreateWindowEx Failed"), TEXT("Error"), MB_OK);
  WNDCLASSEX wndOut = { 0 };
  wndOut.cbSize = sizeof(WNDCLASSEX);
  BOOL bRet = GetClassInfoEx(hInstance, L"0xCC", &wndOut);//查找窗口类
  if (bRet)
  {
   UnregisterClass(L"0xCC", hInstance);//取消注册类
  }
  return 1;
 }

 // 显示窗口
 ShowWindow(hwnd, SW_SHOWDEFAULT);

 // 更新窗口
 UpdateWindow(hwnd);

 // 消息处理
 MSG msg = { 0 };
 while (GetMessage(&msg, 000))
 {
  TranslateMessage(&msg);
  DispatchMessage(&msg);
 }


 return 0;
}

// 窗口过程
LRESULT CALLBACK MainWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{

 switch (uMsg)
 {
 case WM_CREATE:
 {
  HWND hButton1 = CreateWindow(
   TEXT("BUTTON"),
   TEXT("BS_PUSHBUTTON1"),
   WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
   10250,
   15040,
   hwnd,
   (HMENU)ID_BUTTON_PUSH1,
   ghInstance,
   NULL);
  break;
 }
 case WM_COMMAND:
 {
  switch (LOWORD(wParam))
  {
  case ID_BUTTON_PUSH1:
  {
   // 顶级窗口
   HWND hwndMain = FindWindow(TEXT("0xCC"), TEXT("coleak"));

   // 子级窗口
   HWND hwndButton = FindWindowEx(hwndMain, NULL, TEXT("Button"), TEXT("BS_PUSHBUTTON1"));

   // 窗口属性
   // ImageBase
   LONG_PTR ret1 = GetWindowLongPtr(hwndMain, GWLP_HINSTANCE);

   // Style
   LONG_PTR ret2 = GetWindowLongPtr(hwndMain, GWL_STYLE);

   // Parent Hwnd
   LONG_PTR ret3 = GetWindowLongPtr(hwndButton, GWLP_HWNDPARENT);//hwndMain、hwnd
   // 获取文本
   TCHAR szBuffer1[0xFF] = { 0 };
   GetWindowText((HWND)ret3, szBuffer1, 0xFF);
   MessageBox(0, szBuffer1, 00);
   // 设置文本
   SetWindowText((HWND)hwnd, TEXT("New0xCC"));

   // 按钮控件
   SetWindowText(hwndButton, TEXT("BUTTON"));
   DWORD dwCode = GetLastError();
   //RedrawWindow(hwndButton, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
   break;
  }
  }
  break;
 }
 case WM_DESTROY:
 {
  PostQuitMessage(0);
  break;
 }
 default:
  return DefWindowProc(hwnd, uMsg, wParam, lParam);

 }
}

EnumWindows、GetWindowTextA、GetClassNameA

#include <windows.h>
#include <iostream>
#include <vector>
#include <string>

// 结构体用来保存窗口信息
struct WindowInfo {
    HWND hWnd;
    std::string title;
    std::string className;
    BOOL isWindow;
    BOOL isVisible;
    BOOL isEnabled;
    BOOL isMinimized;
    BOOL isMaximized;
};

// 回调函数用于枚举窗口
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam) {
    std::vector<WindowInfo>* pWindowList = (std::vector<WindowInfo>*)lParam;

    char title[256];
    char className[256];

    // 获取窗口标题
    GetWindowTextA(hWnd, title, sizeof(title));
    // 获取窗口类名
    GetClassNameA(hWnd, className, sizeof(className));

    WindowInfo winInfo;
    winInfo.hWnd = hWnd;
    winInfo.title = title;
    winInfo.className = className;
    winInfo.isWindow = IsWindow(hWnd);
    winInfo.isVisible = IsWindowVisible(hWnd);
    winInfo.isEnabled = IsWindowEnabled(hWnd);
    winInfo.isMinimized = IsIconic(hWnd);
    winInfo.isMaximized = IsZoomed(hWnd);

    pWindowList->push_back(winInfo);

    return TRUE;
}

// 获取所有窗口信息的函数
std::vector<WindowInfo> getAllWindows() {
    std::vector<WindowInfo> windowList;
    EnumWindows(EnumWindowsProc, (LPARAM) & windowList);
    return windowList;
}

int main() {
    std::vector<WindowInfo> windows = getAllWindows();

    for (const auto& win : windows) {
        std::cout << "HWND: " << win.hWnd
            << ", Title: " << win.title
            << ", Class: " << win.className
            << ", IsWindow: " << (win.isWindow ? "Yes" : "No")
            << ", Visible: " << (win.isVisible ? "Yes" : "No")
            << ", Enabled: " << (win.isEnabled ? "Yes" : "No")
            << ", Minimized: " << (win.isMinimized ? "Yes" : "No")
            << ", Maximized: " << (win.isMaximized ? "Yes" : "No")
            << std::endl;
    }

    return 0;
}

MFC

框架

#include <afxwin.h>

class CMyApp : public CWinApp
{
public:

    virtual BOOL InitInstance();
};

class CMainWindow : public CFrameWnd
{
public:
    CMainWindow();
    DECLARE_MESSAGE_MAP()
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
};
BOOL CMyApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

CMainWindow::CMainWindow()
{
    Create(NULL, _T("The Hello Application"));
}
CMyApp myApp; 
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

void CMainWindow::OnLButtonDown(UINT nFlags, CPoint point)
{
    CString mes;
    mes.Format(TEXT("x-> %d  y-> %d,flag->%d"), point.x, point.y, nFlags);
    MessageBox(mes);
    CFrameWnd::OnLButtonDown(nFlags, point);
}

两个基类:CWinApp、CFrameWnd

程序入口:CWinApp:InitInstance

消息循环:CWinThread:Run

消息映射:DECLARE_MESSAGE_MAP、BEGIN_MESSAGE_MAP、END_MESSAGE_MAP

对话框框架

CMainDlg.h

#pragma once
#include <afxdialogex.h>
#include <afxwin.h>
#include "resource.h"

// CMainDlg 对话框

class CMainDlg : public CDialogEx
{
 DECLARE_DYNAMIC(CMainDlg)

public:
 CMainDlg(CWnd* pParent = nullptr);   // 标准构造函数
 virtual ~CMainDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
 enum { IDD = IDD_DIALOG_MAIN };
#endif

protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

 DECLARE_MESSAGE_MAP()
};

header.h

#pragma once
#include <afxwin.h>
#include "CMainDlg.h"
class CMyApp : public CWinApp
{
public:
    virtual BOOL InitInstance();
};

CMainDlg.cpp

// CMainDlg.cpp: 实现文件
#include "CMainDlg.h"

// CMainDlg 对话框

IMPLEMENT_DYNAMIC(CMainDlg, CDialogEx)

CMainDlg::CMainDlg(CWnd* pParent /*=nullptr*/)
 : CDialogEx(IDD_DIALOG_MAIN, pParent)
{

}

CMainDlg::~CMainDlg()
{
}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
END_MESSAGE_MAP()


// CMainDlg 消息处理程序

new_mfc.cpp

#include "header.h"
BOOL  CMyApp::InitInstance()
{
 CMainDlg Dlg;
 m_pMainWnd = &Dlg;
 Dlg.DoModal();
 return TRUE;
}
CMyApp cmyapp;

resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 new_mfc.rc 使用
//
#define IDD_DIALOG_MAIN                 101
#define dlg1                            103
#define dlg2                            105
#define IDC_BUTTON_coleak               1001
#define IDC_BUTTON2                     1002
#define IDC_MONTHCALENDAR1              1003
#define IDC_EDIT1                       1004
#define IDC_EDIT_user                   1004
#define IDC_EDIT2                       1005
#define IDC_EDIT_pass                   1005
#define IDC_BUTTON_login                1007
#define budlg1                          1008
#define Budlg2                          1009

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        107
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1012
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

控件变量和事件

CMainDlg.h

#pragma once
#include <afxdialogex.h>
#include <afxwin.h>
#include "resource.h"

// CMainDlg 对话框

class CMainDlg : public CDialogEx
{
 DECLARE_DYNAMIC(CMainDlg)

public:
 CMainDlg(CWnd* pParent = nullptr);   // 标准构造函数
 virtual ~CMainDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
 enum { IDD = IDD_DIALOG_MAIN };
#endif

protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 DECLARE_MESSAGE_MAP()

public:
 virtual BOOL PreTranslateMessage(MSG* pMsg);
 CButton b_coleak;
 CButton b_coleak2;
 CButton BUTTON_log;
 CEdit passtext;
 CEdit usertext;
 afx_msg void OnBnClickedButtoncoleak();
 afx_msg void BUTTON_login();
};

CMainDlg.cpp

// CMainDlg.cpp: 实现文件
//
#include "CMainDlg.h"


// CMainDlg 对话框

IMPLEMENT_DYNAMIC(CMainDlg, CDialogEx)

CMainDlg::CMainDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG_MAIN, pParent)
{

}

CMainDlg::~CMainDlg()
{
}

BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
 {
  CWnd::MessageBox(L"VK_ESCAPE");
  return TRUE;
 }

 return CDialogEx::PreTranslateMessage(pMsg);
}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
 DDX_Control(pDX, IDC_BUTTON_coleak, b_coleak);
 DDX_Control(pDX, IDC_BUTTON2, b_coleak2);
 DDX_Control(pDX, IDC_BUTTON_login, BUTTON_log);
 DDX_Control(pDX, IDC_EDIT_pass, passtext);
 DDX_Control(pDX, IDC_EDIT_user, usertext);
}


BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
 ON_BN_CLICKED(IDC_BUTTON_coleak, &CMainDlg::OnBnClickedButtoncoleak)
 ON_BN_CLICKED(IDC_BUTTON_login, &CMainDlg::BUTTON_login)
END_MESSAGE_MAP()


// CMainDlg 消息处理程序


void CMainDlg::OnBnClickedButtoncoleak()
{
 CString cs;
 b_coleak.GetWindowTextW(cs);
 cs += L"xiao";
 MessageBox(cs);
 b_coleak2.EnableWindow(0);
}


void CMainDlg::BUTTON_login()
{
 CString pass;
 CString user;
 passtext.GetWindowTextW(pass);
 usertext.GetWindowTextW(user);
 MessageBox(pass+":"+user);
}

先在CDialogEx继承的CMainDlg中声明控件变量,再去DoDataExchange中通过DDX_Control将控件变量和控件ID绑定,最后通过DECLARE_MESSAGE_MAP将控件和CMainDlg中声明的回调函数绑定即可

模态、非模态

CMainDlg.h

#pragma once
#include <afxdialogex.h>
#include <afxwin.h>
#include "resource.h"
#include "dlgwin1.h"
#include "dlgwin2.h"


// CMainDlg 对话框

class CMainDlg : public CDialogEx
{
 DECLARE_DYNAMIC(CMainDlg)

public:
 dlgwin2 dlgwind2;
 CMainDlg(CWnd* pParent = nullptr);   // 标准构造函数
 virtual ~CMainDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
 enum { IDD = IDD_DIALOG_MAIN };
#endif

protected:
 virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
 DECLARE_MESSAGE_MAP()

public:
 virtual BOOL PreTranslateMessage(MSG* pMsg);
 CButton b_coleak;
 CButton b_coleak2;
 CButton BUTTON_log;
 CEdit passtext;
 CEdit usertext;
 CButton bu1;
 CButton bu2;
 afx_msg void OnBnClickedButton1();
 afx_msg void OnBnClickedButton2();
 afx_msg void OnBnClickedButtoncoleak();
 afx_msg void BUTTON_login();
};

CMainDlg.cpp

// CMainDlg.cpp: 实现文件
//
#include "CMainDlg.h"


// CMainDlg 对话框

IMPLEMENT_DYNAMIC(CMainDlg, CDialogEx)

CMainDlg::CMainDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG_MAIN, pParent)
{
 dlgwind2.Create(dlg2);
}

CMainDlg::~CMainDlg()
{
}

BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
 {
  CWnd::MessageBox(L"VK_ESCAPE");
  return TRUE;
 }

 return CDialogEx::PreTranslateMessage(pMsg);
}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
 CDialogEx::DoDataExchange(pDX);
 DDX_Control(pDX, IDC_BUTTON_coleak, b_coleak);
 DDX_Control(pDX, IDC_BUTTON2, b_coleak2);
 DDX_Control(pDX, IDC_BUTTON_login, BUTTON_log);
 DDX_Control(pDX, IDC_EDIT_pass, passtext);
 DDX_Control(pDX, IDC_EDIT_user, usertext);
 DDX_Control(pDX, budlg1, bu1);
 DDX_Control(pDX, Budlg2, bu2);
}


BEGIN_MESSAGE_MAP(CMainDlg, CDialogEx)
 ON_BN_CLICKED(IDC_BUTTON_coleak, &CMainDlg::OnBnClickedButtoncoleak)
 ON_BN_CLICKED(IDC_BUTTON_login, &CMainDlg::BUTTON_login)
 ON_BN_CLICKED(Budlg2, &CMainDlg::OnBnClickedButton2)
 ON_BN_CLICKED(budlg1, &CMainDlg::OnBnClickedButton1)
END_MESSAGE_MAP()


// CMainDlg 消息处理程序


void CMainDlg::OnBnClickedButtoncoleak()
{
 CString cs;
 b_coleak.GetWindowTextW(cs);
 cs += L"xiao";
 MessageBox(cs);
 b_coleak2.EnableWindow(0);
 // TODO: 在此添加控件通知处理程序代码
}


void CMainDlg::BUTTON_login()
{
 CString pass;
 CString user;
 passtext.GetWindowTextW(pass);
 usertext.GetWindowTextW(user);
 MessageBox(pass+":"+user);
}


void CMainDlg::OnBnClickedButton1()
{
 dlgwin1 dlgwind1;
 dlgwind1.DoModal();
}


void CMainDlg::OnBnClickedButton2()
{
 dlgwind2.ShowWindow(SW_SHOW);
}

模态对话框:

在交互捕获处创建->dlgwin1 dlgwind1;dlgwind1.DoModal();

非模态对话框:

在主窗口成员变量里声明以常驻->dlgwin2 dlgwind2;

在主窗口构造函数里创建窗口->dlgwind2.Create(dlg2);

在交互捕获处显示->dlgwind2.ShowWindow(SW_SHOW);

决策处理

void CMainDlg::OnClose()
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 int ret=::MessageBox(NULL,L"是否确认关闭窗口",L"提示",MB_YESNO|MB_ICONQUESTION);
 if (ret==IDYES)
  CDialogEx::OnClose();
}

文件对话框

CFileDialog

#include <afxdlgs.h>

explicit CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
 LPCTSTR lpszDefExt = NULL,
 LPCTSTR lpszFileName = NULL,
 DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
 LPCTSTR lpszFilter = NULL,
 CWnd* pParentWnd = NULL,
 DWORD dwSize = 0,
 BOOL bVistaStyle = TRUE)
;

CMainDlg::OnfileButton

void CMainDlg::OnfileButton()
{
 // 构造对象
 CFileDialog cFileDlg(
  TRUE,
  NULL,
  _T("default.ini"),
  OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
  _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"),
  this)
;;
    
 // 初始内容
 cFileDlg.m_ofn.lpstrInitialDir = _T("D:\");
 cFileDlg.m_ofn.lpstrTitle = _T("打开指定格式文件");

 // 显示窗口
 if (cFileDlg.DoModal() == IDOK)
 {
  CString str1 = cFileDlg.GetPathName();
  CString str2 = cFileDlg.GetFileName();
  CString str3 = cFileDlg.GetFileTitle();
  CString str4 = cFileDlg.GetFileExt();
  MessageBox(str1+";"+ str2+";"+ str3+";"+ str4+";");
  return;
 }
 else
 {
  MessageBox(_T("打开文件失败"), _T("警告"), MB_OK | MB_ICONERROR);
 }
}
  • GetPathName函数:获取用户选择的完整文件路径,包括文件名和扩展名
  • GetFileName函数:仅获取用户选择的文件名+扩展名,不包括路径
  • GetFileTitle函数获取用户选择的文件名
  • GetFileExt函数:获取用户选择文件的扩展名

控件补充

radiobutton/check box

void CMainDlg::OnBnClickedqr()
{
 CString cs;
 CButton* pCheckBox2 = (CButton*)GetDlgItem(jr);

 if (pCheckBox2->GetCheck() == BST_CHECKED) {
  cs += "兼容模式";
 }
 if (b64.GetCheck() == BST_CHECKED)
 {
  cs += ";x64";
 }
 if (b86.GetCheck() == BST_CHECKED)
 {
  cs += ";x86";
 }
 MessageBox(cs);
}

ListBox

void CMainDlg::OnBnClickedButtonadd()
{
 CString cs;
 edit1.GetWindowTextW(cs);
 listbox.AddString(cs);
}

void CMainDlg::OnBnClickedButtondel()
{
 CString cs;
 int ret = listbox.GetCurSel();
 if (ret >= 0)
 {
  listbox.DeleteString(ret);
 }
}

void CMainDlg::OnBnClickedButtoncl()
{
 listbox.ResetContent();
}


void CMainDlg::OnBnClickedButtonget()
{
 int nIndex = listbox.GetCurSel();
 if (nIndex != LB_ERR)
 {
  CString strItemText;
  listbox.GetText(nIndex, strItemText);
  MessageBox(strItemText);
 }
}

void CMainDlg::OnBnClickedcset()
{
 listbox.SetCurSel(0);
}

CComboBox

void CMainDlg::OnBnClickedButton12()
{
 CString strComboText;
 cedit.GetWindowTextW(strComboText);
 if (strComboText.IsEmpty() == FALSE)
 {
  ccombox.AddString(strComboText);
 }
}


void CMainDlg::OnBnClickedButton13()
{

 if (ccombox.GetCount() > 0)
 {
  ccombox.SetCurSel(0);
 }
}


void CMainDlg::OnBnClickedButton14()
{
 int nIndex = ccombox.GetCurSel();
 if (nIndex != CB_ERR)
 {
  ccombox.DeleteString(nIndex);
  OnBnClickedButton13();
 }
}


void CMainDlg::OnBnClickedButton15()
{
 int nIndex = ccombox.GetCurSel();
 if (nIndex != CB_ERR)
 {
  CString strComboText;
  ccombox.GetLBText(nIndex, strComboText);
  MessageBox(strComboText);
 }
}

void CMainDlg::OnBnClickedButton16()
{
 ccombox.ResetContent();
}
样式 列表框何时可见 静态控件或编辑控件
simple 始终 可编辑
dropdown 下拉时 可编辑
下拉列表 下拉时 静态

CStatic

void CMainDlg::OnBnClickedButtonpc()
 
{
// 位图对象
CBitmap bitmap;

// 加载资源
bitmap.LoadBitmapW(IDB_BITMAP2);

// 控件对象
CStatic* pStaticPic = (CStatic*)GetDlgItem(IDC_pic);

// 修改风格
pStaticPic->ModifyStyle(SS_ENHMETAFILE, SS_BITMAP | SS_CENTERIMAGE);

// 设置位图
//pStaticPic->SetBitmap(bitmap);//加载图片,但大小不匹配


//匹配大小加载
// 设备对象
CDC* pDC = pStaticPic->GetDC();
CDC pCom;
pCom.CreateCompatibleDC(pDC);

// 图像资源
SelectObject(pCom, bitmap);

// 控件数据
CRect rect;
pStaticPic->GetClientRect(rect);

// 图像数据
BITMAP bitmapInfo;
bitmap.GetBitmap(&bitmapInfo);

// 提升质量
pDC->SetStretchBltMode(HALFTONE);

// 动态调整
pDC->StretchBlt(00, rect.Width(), rect.Height(), &pCom, 00, bitmapInfo.bmWidth, bitmapInfo.bmHeight, SRCCOPY);

// 释放对象
ReleaseDC(pDC);
}

HDC是句柄;CDC是MFC封装的Windows设备相关的一个类

COLORONCOLOR:速度较快,适用于不需要高质量缩放的情况;HALFTONE:处理速度慢,图像质量高

CTreeCtrl

void CMainDlg::DirFileInfo(HTREEITEM hParent, const CString& strPath)
{
 CFileFind fileFind;
 CString CurPath = strPath + _T("\*.*");
 BOOL bRet = fileFind.FindFile(CurPath);
 while (bRet)
 {
  bRet = fileFind.FindNextFileW();
  if (fileFind.IsDirectory() && !fileFind.IsDots())
  {
   HTREEITEM hRoot = m_Tree.InsertItem(fileFind.GetFileName(), 00, hParent);
   DirFileInfo(hRoot, strPath + _T("\") + fileFind.GetFileName());
  }
  else if (!fileFind.IsDirectory() && !fileFind.IsDots() && !fileFind.IsHidden())
  {
   m_Tree.InsertItem(fileFind.GetFileName(), 00, hParent);
  }
 }
}

void CMainDlg::OnBnClickedButtonfile()
{

 DWORD dwDrivers = ::GetLogicalDrives();

 for (size_t i = 0; i < 26; i++)
 {
  if ((dwDrivers & (1 << i)) != 0)
  {
   CString strDriver;
   strDriver.Format(_T("%c:"), 'A' + i);
   HTREEITEM hRoot = m_Tree.InsertItem(strDriver, 00, TVI_ROOT, TVI_LAST);
   DirFileInfo(hRoot, strDriver);
  }
 }
}

getLogicalDrives:返回值为表示当前可用磁盘驱动器的位掩码

全图如下

Windows GUI编程指南

reference

https://learn.microsoft.com/zh-cn/cpp/mfc/controls-mfc?view=msvc-170
https://learn.microsoft.com/zh-cn/cpp/mfc/mfc-desktop-applications?view=msvc-170
https://blog.csdn.net/2301_80612536/category_12724632.html
https://blog.csdn.net/2301_80612536/category_12729150.html
https://blog.csdn.net/2301_80612536/category_12737903.html

原文始发于微信公众号(渗透测试安全攻防):Windows GUI编程指南

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月15日13:11:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Windows GUI编程指南https://cn-sec.com/archives/3268555.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息