关注并星标🌟 一起学安全❤️
作者: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, 0, 0, 0))
{
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,
10, 10,
150, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH1,
ghInstance,
NULL);
hButton2 = CreateWindow(
TEXT("BUTTON"),
TEXT("BS_PUSHBUTTON2"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
170, 10,
150, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH2,
ghInstance,
NULL);
hButton3 = CreateWindow(
TEXT("BUTTON"),
TEXT("BS_PUSHBUTTON3"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_BITMAP,
330, 10,
150, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH3,
ghInstance,
NULL);
hButton4 = CreateWindow(
TEXT("BUTTON"),
TEXT("BS_PUSHBUTTON4"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
170, 60,
150, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH4,
ghInstance,
NULL);
hButton5 = CreateWindow(
TEXT("BUTTON"),
TEXT("BS_PUSHBUTTON5"),
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
330, 60,
150, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH5,
ghInstance,
NULL);
hCheck = CreateWindow(
TEXT("BUTTON"),
TEXT("CHECKBOX"),
WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
10, 60,
150, 40,
hwnd,
(HMENU)ID_BUTTON_CHECKBOX1,
ghInstance,
NULL);
hRADIOBUTTON1 = CreateWindow(
TEXT("BUTTON"),
TEXT("RADIOBUTTON1"),
WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
10, 110,
150, 40,
hwnd,
(HMENU)ID_BUTTON_RADIOBUTTON1,
ghInstance,
NULL);
hRADIOBUTTON2 = CreateWindow(
TEXT("BUTTON"),
TEXT("RADIOBUTTON2"),
WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
10, 160,
150, 40,
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"), NULL, NULL);
break;
}
case ID_BUTTON_PUSH2:
{
SendMessage(hButton1, BM_CLICK, 0, 0);
break;
}
case ID_BUTTON_CHECKBOX1:
{
BOOL ret = SendMessage(hCheck, BM_GETCHECK, 0, 0) == 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,
10, 10, 200, 25,
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,
10, 50, 200, 100,
hwnd,
HMENU(ID_EDIT_MULTILINE),
ghInstance,
NULL);
hPassWord = CreateWindow(
TEXT("EDIT"),
NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_PASSWORD,
10, 165, 200, 25,
hwnd,
HMENU(ID_EDIT_PASSWORD),
ghInstance,
NULL);
hReadOnly = CreateWindow(
TEXT("EDIT"),
TEXT("ES_READONLY"),
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_READONLY,
10, 205, 200, 25,
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,
10, 250,
150, 40,
hwnd,
(HMENU)ID_BUTTON_PUSH1,
ghInstance,
NULL);
HWND hDropDown = CreateWindow(
TEXT("COMBOBOX"),
NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWN,
10, 10, 200, 200,
hwnd,
HMENU(ID_CB_DROPDOWN),
ghInstance,
NULL);
HWND hDropList = CreateWindow(
TEXT("COMBOBOX"),
NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST,
250, 10, 200, 200,
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, 0, 0);
SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWNLIST), CB_SETCURSEL, 0, 0);
// 清空表项
CB_RESETCONTENT;
break;
}
}
switch (HIWORD(wParam))
{
case CBN_SELCHANGE:
{
if (LOWORD(wParam) == ID_CB_DROPDOWNLIST)
{
DWORD dwIndex = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
TCHAR szBuffer[0xff] = { 0 };
SendMessage((HWND)lParam, CB_GETLBTEXT, dwIndex, (LPARAM)szBuffer);
MessageBox(hwnd, szBuffer, 0, 0);
break;
}
}
case CBN_DROPDOWN:
{
if (LOWORD(wParam) == ID_CB_DROPDOWNLIST)
{
// 清空数据
SendMessage((HWND)lParam, CB_RESETCONTENT, 0, 0);
// 获取数据
DWORD dwIndex = SendMessage(GetDlgItem(hwnd, ID_CB_DROPDOWN), CB_GETCURSEL, 0, 0);
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, 0, 0, 0))
{
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, 0, 0, 0))
{
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,
10, 250,
150, 40,
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, 0, 0);
// 设置文本
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(0, 0, rect.Width(), rect.Height(), &pCom, 0, 0, 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(), 0, 0, hParent);
DirFileInfo(hRoot, strPath + _T("\") + fileFind.GetFileName());
}
else if (!fileFind.IsDirectory() && !fileFind.IsDots() && !fileFind.IsHidden())
{
m_Tree.InsertItem(fileFind.GetFileName(), 0, 0, 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, 0, 0, TVI_ROOT, TVI_LAST);
DirFileInfo(hRoot, strDriver);
}
}
}
getLogicalDrives:返回值为表示当前可用磁盘驱动器的位掩码
全图如下
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编程指南
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论