windows.h 是 Windows API 的核心头文件之一

windows.h 是 Windows API 的核心头文件之一,用于开发 Windows 应用程序和系统应用。它包含了与 Windows 操作系统相关的众多功能和结构体。以下是对 windows.h 的全面深入介绍:

1. 概述

windows.h 提供了访问 Windows 操作系统功能的接口,包括窗口管理、图形界面、消息处理、文件操作、进程和线程管理等。它是 Windows 应用程序开发的基础头文件。

2. 主要功能

  • 窗口管理

    • 窗口类和窗口 :定义和管理窗口,包括创建窗口 (CreateWindow)、窗口消息处理 (WndProc)、窗口销毁 (DestroyWindow) 等。
    • 消息处理 :处理和响应窗口消息,如 WM_PAINTWM_DESTROY 等。
  • 图形界面

    • 绘图函数 :提供绘图功能的函数,例如 BeginPaintEndPaintDrawTextBitBlt 等。
    • GDI(图形设备接口):支持图形和文本的输出,包括画笔、画刷、字体、图像处理等。
  • 文件操作

    • 文件和目录操作 :例如 CreateFileReadFileWriteFileDeleteFileFindFirstFileFindNextFile 等。
  • 进程和线程管理

    • 进程控制 :创建和终止进程,例如 CreateProcessTerminateProcessGetProcessId 等。
    • 线程管理 :创建和同步线程,例如 CreateThreadWaitForSingleObjectSuspendThreadResumeThread 等。
  • 内存管理

    • 内存分配和释放 :例如 VirtualAllocVirtualFreeGlobalAllocGlobalFreeHeapCreateHeapAlloc 等。
  • 系统信息

    • 获取系统信息 :例如 GetSystemInfoGetVersionEx 等。
  • 消息框和对话框

    • 显示消息框 :例如 MessageBox
    • 对话框 :创建和管理对话框,如 DialogBoxCreateDialogEndDialog 等。

3. 常用结构体和类型

  • HWND:窗口句柄。
  • HDC:设备上下文句柄,用于绘图操作。
  • HINSTANCE:应用程序实例句柄。
  • HANDLE:通用句柄,用于表示各种资源,如文件、线程等。
  • MSG:消息结构体,用于传递窗口消息。
  • WNDCLASS:窗口类结构体,用于定义窗口的行为和样式。

4. 常见宏和常量

  • WM_PAINT:窗口绘制消息。
  • WM_DESTROY:窗口销毁消息。
  • SW_SHOW:窗口显示模式。
  • GENERIC_READGENERIC_WRITE:文件访问模式。
  • CREATE_NEWCREATE_ALWAYS:文件创建模式。

5. 包含 windows.h 的注意事项

  • 预处理指令windows.h 可能会包含大量其他头文件,影响编译时间。
  • 宏定义冲突:一些库可能定义了与 Windows API 冲突的宏。
  • 多重包含windows.h 通常会使用 #ifndef#define 预处理指令来防止多重包含。

以下是一个简单的示例,展示如何使用 windows.h 创建一个基本的窗口应用程序:

cpp 复制代码
#include <windows.h>  // 包含 Windows API 的头文件

// 窗口过程函数:处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {  // 根据消息类型执行不同的处理
        case WM_DESTROY:  // 处理窗口销毁消息
            PostQuitMessage(0);  // 发送退出消息,结束消息循环
            return 0;  // 处理完消息后返回 0
        case WM_PAINT:  // 处理窗口绘制消息
            {
                PAINTSTRUCT ps;  // 画布绘制结构体
                HDC hdc = BeginPaint(hwnd, &ps);  // 开始绘制,获取设备上下文
                FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));  // 填充窗口背景为白色
                EndPaint(hwnd, &ps);  // 结束绘制
            }
            return 0;  // 处理完消息后返回 0
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);  // 对未处理的消息调用默认处理程序
}

// 程序入口函数
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";  // 窗口类名

    // 定义并初始化窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;  // 指定窗口过程函数
    wc.hInstance = hInstance;  // 当前实例句柄
    wc.lpszClassName = CLASS_NAME;  // 窗口类名

    RegisterClass(&wc);  // 注册窗口类

    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, "Sample Window", WS_OVERLAPPEDWINDOW,  // 窗口扩展样式、类名、窗口标题和样式
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,  // 窗口位置和大小(默认值)
        NULL, NULL, hInstance, NULL  // 父窗口、菜单、实例句柄和附加数据
    );

    if (hwnd == NULL) {  // 检查窗口创建是否成功
        return 0;  // 创建失败,退出程序
    }

    ShowWindow(hwnd, nCmdShow);  // 显示窗口
    UpdateWindow(hwnd);  // 更新窗口的显示

    MSG msg;  // 消息结构体
    // 消息循环
    while (GetMessage(&msg, NULL, 0, 0)) {  // 从消息队列获取消息
        TranslateMessage(&msg);  // 将虚拟键消息转换为字符消息
        DispatchMessage(&msg);  // 分发消息到窗口过程函数
    }

    return 0;  // 消息循环退出后,返回程序执行结果
}

注释解释

  1. 头文件包含

    • #include <windows.h>:包含 Windows API 的头文件,提供访问 Windows 操作系统功能的接口。
  2. 窗口过程函数 (WindowProc)

    • LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) :窗口过程函数,用于处理窗口的各种消息。
      • switch (uMsg):根据消息类型选择处理方法。
      • case WM_DESTROY :处理窗口销毁消息,调用 PostQuitMessage 发送退出消息。
      • case WM_PAINT :处理窗口绘制消息,使用 BeginPaintEndPaint 进行绘制操作。
      • return DefWindowProc(hwnd, uMsg, wParam, lParam):对未处理的消息调用默认处理程序。
  3. 程序入口函数 (WinMain)

    • int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) :程序的入口点。
      • const char CLASS_NAME[]:定义窗口类名。
      • WNDCLASS wc = {0}:定义并初始化窗口类结构体。
      • RegisterClass(&wc):注册窗口类。
      • CreateWindowEx:创建窗口,指定窗口类、标题、样式等参数。
      • ShowWindow(hwnd, nCmdShow)UpdateWindow(hwnd):显示和更新窗口。
      • while (GetMessage(&msg, NULL, 0, 0)):消息循环,从消息队列中获取消息并分发到窗口过程函数。

总结

这段代码演示了一个基本的 Windows 应用程序框架,包括窗口的创建、显示、消息处理和消息循环。通过详细的注释,可以更好地理解每个函数的作用和消息的处理过程。


cpp 复制代码
#include <windows.h>
#include <tlhelp32.h>  // 包含工具帮助函数的头文件

#define ID_LISTBOX 1  // 定义列表框控件的ID

// 函数声明
void PopulateProcessList(HWND hwndListBox);

// 函数:填充进程列表到列表框
void PopulateProcessList(HWND hwndListBox) {
    HANDLE hProcessSnap;           // 进程快照句柄
    PROCESSENTRY32 pe32;           // 进程信息结构体

    // 创建系统进程的快照
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE) {
        // 快照创建失败,返回
        return;
    }

    pe32.dwSize = sizeof(PROCESSENTRY32);  // 设置结构体大小

    // 获取第一个进程的信息
    if (!Process32First(hProcessSnap, &pe32)) {
        // 获取第一个进程失败,关闭句柄并返回
        CloseHandle(hProcessSnap);
        return;
    }

    // 遍历所有进程
    do {
        // 将进程名添加到列表框中
        SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)pe32.szExeFile);
    } while (Process32Next(hProcessSnap, &pe32));  // 获取下一个进程的信息
    
    // 关闭进程快照句柄
    CloseHandle(hProcessSnap);
}

// 窗口过程函数:处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    static HWND hwndListBox;  // 列表框句柄,静态变量在窗口过程函数中保留

    switch (uMsg) {
        case WM_CREATE: {
            // 创建列表框控件
            hwndListBox = CreateWindow(
                "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | LBS_NOTIFY,
                10, 10, 300, 400, hwnd, (HMENU)ID_LISTBOX, ((LPCREATESTRUCT)lParam)->hInstance, NULL
            );
            // 填充进程列表到列表框中
            PopulateProcessList(hwndListBox);
            return 0;
        }
        case WM_DESTROY:
            // 处理窗口销毁消息,发送退出消息并终止应用程序
            PostQuitMessage(0);
            return 0;
    }
    // 默认处理其他消息
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

// 程序入口点
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";  // 窗口类名

    WNDCLASS wc = {0};  // 窗口类结构体初始化
    wc.lpfnWndProc = WindowProc;  // 窗口过程函数
    wc.hInstance = hInstance;  // 应用程序实例句柄
    wc.lpszClassName = CLASS_NAME;  // 窗口类名

    // 注册窗口类
    RegisterClass(&wc);

    // 创建窗口
    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, "Process List Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 400, 500,
        NULL, NULL, hInstance, NULL
    );

    // 检查窗口创建是否成功
    if (hwnd == NULL) {
        return 0;
    }

    // 显示窗口并更新其显示
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);  // 翻译虚拟键消息
        DispatchMessage(&msg);   // 分发消息到窗口过程
    }

    return 0;
}

详细解释:

  1. 头文件和宏定义

    • #include <windows.h>#include <tlhelp32.h>:引入必要的Windows API和工具帮助函数的头文件。
    • #define ID_LISTBOX 1:定义列表框控件的ID,方便在窗口过程函数中引用。
  2. PopulateProcessList 函数

    • HANDLE hProcessSnap:保存进程快照的句柄。
    • PROCESSENTRY32 pe32:保存进程信息的结构体。
    • CreateToolhelp32Snapshot:创建系统进程快照。
    • Process32FirstProcess32Next:遍历进程列表。
    • SendMessage:将进程名添加到列表框中。
    • CloseHandle:关闭进程快照句柄。
  3. WindowProc 函数

    • 处理窗口消息。
    • WM_CREATE:创建窗口时调用,创建并初始化列表框,调用 PopulateProcessList 填充进程列表。
    • WM_DESTROY:窗口销毁时调用,发送退出消息。
    • 其他消息通过 DefWindowProc 进行默认处理。
  4. WinMain 函数

    • 入口点函数,设置并注册窗口类,创建窗口,显示窗口,进入消息循环。

这个程序创建了一个窗口,并在窗口中显示系统的所有进程名,使用列表框控件展示信息。


cpp 复制代码
#include <windows.h>

#define ID_BUTTON 1  // 定义按钮的 ID

// 窗口过程函数:处理窗口的消息
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hwnd, &ps);
                FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
                EndPaint(hwnd, &ps);
            }
            return 0;
        case WM_COMMAND:
            if (LOWORD(wParam) == ID_BUTTON) {  // 处理按钮点击消息
                MessageBox(hwnd, "按钮被点击了!", "消息", MB_OK | MB_ICONINFORMATION);
            }
            return 0;
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    const char CLASS_NAME[] = "Sample Window Class";

    WNDCLASS wc = {0};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(
        0, CLASS_NAME, "Sample Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL
    );

    if (hwnd == NULL) {
        return 0;
    }

    // 创建按钮
    CreateWindow(
        "BUTTON",  // 按钮控件的类名
        "点击我",  // 按钮的文本
        WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // 按钮的样式
        10, 10, 100, 30,  // 按钮的位置和大小
        hwnd,  // 父窗口
        (HMENU)ID_BUTTON,  // 按钮的 ID
        hInstance,  // 实例句柄
        NULL  // 附加数据
    );

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

WIN32_FIND_DATA 结构是 Windows API 中用于存储通过 FindFirstFileFindFirstFileExFindNextFile 函数找到的文件系统对象(如文件和目录)的信息的结构。它提供了关于每个找到的对象的详细属性信息。

cpp 复制代码
#include <windows.h>
#include <stdio.h>

void list_files(const char *path) {
    WIN32_FIND_DATA findFileData;
    HANDLE hFind = FindFirstFile(path, &findFileData);

    if (hFind == INVALID_HANDLE_VALUE) {
        // Correct format specifier for DWORD (unsigned long)
        printf("FindFirstFile failed (%lu)\n", (unsigned long)GetLastError());
        return;
    }

    do {
        // 检查文件是否是目录
        if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            printf("Directory: %s\n", findFileData.cFileName);
        } else {
            printf("File: %s\n", findFileData.cFileName);
        }
    } while (FindNextFile(hFind, &findFileData) != 0);

    FindClose(hFind);
}


int main() {
    list_files("C:\\Users\\Administrator\\Documents\\*"); // 使用 * 列出所有文件和目录
    return 0;
}


// WIN32_FIND_DATA 结构体定义
// typedef struct _WIN32_FIND_DATA {
//     DWORD dwFileAttributes;       // 文件的属性
//     FILETIME ftCreationTime;      // 文件的创建时间
//     FILETIME ftLastAccessTime;    // 文件的最后访问时间
//     FILETIME ftLastWriteTime;     // 文件的最后写入时间
//     DWORD nFileSizeHigh;          // 文件大小的高32位
//     DWORD nFileSizeLow;           // 文件大小的低32位
//     DWORD dwReserved0;            // 保留字段
//     DWORD dwReserved1;            // 保留字段
//     TCHAR cFileName[MAX_PATH];    // 文件名
//     TCHAR cAlternateFileName[14]; // 文件的备用名称
// } WIN32_FIND_DATA;

// 字段说明
// dwFileAttributes:
// 文件或目录的属性标志。可以是下列之一(或其组合):
// FILE_ATTRIBUTE_DIRECTORY:这是一个目录。
// FILE_ATTRIBUTE_ARCHIVE:文件已更改,自上次备份以来。
// FILE_ATTRIBUTE_HIDDEN:文件是隐藏文件。
// FILE_ATTRIBUTE_READONLY:文件是只读的。
// FILE_ATTRIBUTE_SYSTEM:文件是系统文件。
// FILE_ATTRIBUTE_NORMAL:文件没有其他属性(除了存储和读/写访问)。
// ftCreationTime:
// 文件或目录的创建时间。类型为 FILETIME 结构体,用于表示日期和时间。
// ftLastAccessTime:
// 文件或目录的最后访问时间。类型为 FILETIME 结构体。
// ftLastWriteTime:
// 文件或目录的最后写入时间。类型为 FILETIME 结构体。
// nFileSizeHigh 和 nFileSizeLow:
// 文件的大小。由于文件大小可能大于 2GB,因此它被分为高 32 位 (nFileSizeHigh) 和低 32 位 (nFileSizeLow)。
// dwReserved0 和 dwReserved1:
// 保留字段,通常不需要使用或设置这些字段。
// cFileName:
// 文件的名称。这个字段是一个数组,最大长度为 MAX_PATH(通常为 260 个字符)。
// cAlternateFileName:
// 文件的备用名称,通常用于 DOS 兼容性。这个字段的长度为 14 个字符。

Windows编程涉及的内容非常广泛,涵盖了从基本的窗口创建到复杂的消息处理、图形绘制、文件操作、网络通信等多种功能。以下是一些Windows编程的核心内容和概念的概览:

1. 窗口管理

  • 创建和显示窗口 :使用CreateWindowCreateWindowEx函数创建窗口,并通过ShowWindowUpdateWindow函数显示和更新窗口。
  • 窗口过程 :窗口过程函数(WindowProc)用于处理窗口消息(如鼠标点击、键盘输入、窗口重绘等)。
  • 消息循环 :在WinMain函数中,通过GetMessageTranslateMessageDispatchMessage函数进行消息循环,确保程序响应用户操作。

2. 控件和对话框

  • 控件 :如按钮、编辑框、列表框等,使用CreateWindowCreateWindowEx函数创建,并通过SendMessage函数与控件交互。
  • 对话框 :使用DialogBoxCreateDialog函数创建和管理对话框,处理对话框中的消息。

3. 绘图和图形

  • 设备上下文(DC) :用于绘制图形的环境,获取方法包括BeginPaintGetDC
  • 绘图函数 :如DrawTextEllipseRectangle等,用于绘制文本、图形等。
  • GDI+:提供更高级的绘图功能,如图像处理和渐变填充。

4. 消息处理

  • 消息定义 :Windows系统的消息定义在winuser.h中,如WM_PAINTWM_COMMANDWM_DESTROY
  • 消息映射:将特定消息映射到处理函数。

5. 文件和资源管理

  • 文件操作 :使用CreateFileReadFileWriteFile等函数进行文件操作。
  • 资源 :使用资源文件(.rc)定义应用程序的资源,如图标、菜单、对话框等,通过LoadResourceFindResource等函数加载和使用资源。

6. 进程和线程

  • 进程管理 :使用CreateProcess函数创建新进程,TerminateProcess结束进程。
  • 线程管理 :使用CreateThread函数创建线程,WaitForSingleObject等函数等待线程结束。

7. 网络编程

  • Winsock :提供网络编程功能,使用WSAStartup初始化,socket创建套接字,connectsend进行网络通信。

8. API调用

  • Windows API :使用系统提供的API函数进行各种操作,如MessageBoxSetWindowText等。

9. COM编程

  • 组件对象模型(COM) :用于创建可重用的对象组件,通过CoInitializeCoCreateInstance等函数进行操作。

10. 高级主题

  • 多媒体编程:使用DirectX、Windows Media Player等进行音视频处理。
  • 安全性:处理权限、加密等安全相关问题。

学习建议

  • 从基础开始:首先掌握基本的窗口创建和消息处理。
  • 逐步深入:逐步学习更复杂的控件、图形绘制、文件操作等。
  • 参考文档 :使用官方文档(如Microsoft Docs),阅读相关的教程和书籍。
  • 实践项目:通过实际项目和代码实践来加深理解。

Windows编程确实很复杂,但通过逐步学习和实践,可以掌握这些技术并运用到实际应用中。

相关推荐
怪兽软家1 天前
DaVinci Resolve/达芬奇 20安装教程及下载
windows·经验分享·生活
chao1898441 天前
完整MES系统实现 (C# 客户端服务器)
服务器·windows·c#
Hello_Embed1 天前
Windows 安装 Claude Code 并接入 模型
windows·笔记·ai编程
Muyuan19981 天前
28.Paper RAG Agent 开发记录:修复 LLM Rerank 的解析、Fallback 与可验证性
linux·人工智能·windows·python·django·fastapi
AxureMost1 天前
4DDiG DLL Fixe 1.0.8.2 系统DLL修复工具
windows
怣疯knight1 天前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
空中海1 天前
02. 静态逆向、Manifest 分析与 Smali 重打包
服务器·网络·windows
一拳一个娘娘腔1 天前
告别图形化界面:基于CLI的Windows系统入侵排查与防御实战手册
windows·安全
疋瓞1 天前
批处理_基础补充、文件和文件夹处理_02
windows
nudt_qxx1 天前
Ubuntu 24.04/26.04 与 Windows 10/11 双系统时间不同步终极解决方案
windows·stm32·ubuntu