Windows窗口函数常规
1、wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) 宽字符版本主函数
hInstance (HINSTANCE): 这是一个句柄,指向当前应用程序的实例。当程序启动时,系统会为该应用程序创建一个实例,并且这个句柄会被用来标识它。此句柄可以用于获取资源或注册窗口类等操作。常见的其他写法,如C语言封装C++ ,C里调用C++的new 创建实例;每次使用实例句柄进行访问; hPrevInstance (HINSTANCE): 在16位Windows中,如果应用程序之前有一个实例正在运行,那么这里会返回那个实例的句柄。但在32位和64位Windows中,这个参数总是为 NULL,因为现代Windows不允许两个相同应用程序的实例同时运行(除非使用了特定的技术来绕过这种限制)。 lpCmdLine (LPWSTR): 这是指向命令行字符串的指针,该字符串包含了传递给程序的所有命令行参数。这些参数可以被解析以执行不同的操作或提供额外的数据。LPWSTR 指示这是一个宽字符(wchar_t)指针。 nCmdShow (int): 这个整数参数指示了应用程序的主窗口应该如何显示。例如,它可以指示窗口是否应该最大化、最小化或正常显示。这些值通常是由操作系统设置的,并可以通过预定义的常量(如 SW_SHOWDEFAULT, SW_SHOWMINIMIZED, SW_SHOWMAXIMIZED, SW_SHOWNORMAL 等)来识别。
2、com组件初始化
COM的核心概念包括接口、类、对象、组件、COM的生命周期;COM是一种组件技术
// 全局变量 CAppModule _Module; // WinMain 函数 int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { // 初始化 COM if (!_Module.Init(NULL, hInstance)) { AfxMessageBox(_T("Initialization failed.")); return 0; } // 创建并运行应用程序对象 CMyApp theApp; theApp.m_hWndMain = NULL; // 主窗口句柄 int nRetCode = 0; if (!theApp.InitInstance()) { nRetCode = 1;} else { nRetCode = theApp.Run();} // 清理 theApp.TermInstance(); // 释放 COM _Module.Term();
::OleUninitialize(); return nRetCode; }
3、内存转储生成
Detours组件;运行时拦截和重定向函数调用;拦截未捕获的异常,并生成转储文件
#include <windows.h> #include <dbghelp.h> #include <detours.h> // 假设你想拦截的函数原型 //一般拦截未捕获异常_UnhandledExceptionFilter = DetourFindFunction("KERNEL32.DLL", "UnhandledExceptionFilter"); void WINAPI OriginalFunction(); // 钩函数 void WINAPI HookFunction() { // 检查是否需要生成转储 if (/* 你的条件 */) { HANDLE hProcess = GetCurrentProcess(); HANDLE hFile = CreateFile("C:\\path\\to\\your\\dumpfile.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { MINIDUMP_EXCEPTION_INFORMATION ExInfo; ExInfo.ThreadId = GetCurrentThreadId(); ExInfo.ExceptionPointers = NULL; ExInfo.ClientPointers = FALSE; MiniDumpWriteDump(hProcess, GetCurrentProcessId(), hFile, MiniDumpNormal|MiniDumpFilterMemory, &ExInfo, NULL, NULL); CloseHandle(hFile); } } // 调用原始函数 OriginalFunction(); } int main() { // 初始化 Detours HRESULT hr = DetourInitialize(NULL); if (FAILED(hr)) { printf("DetourInitialize failed: %08x\n", hr); return 1; } // 设置事务 hr = DetourTransactionBegin(); if (FAILED(hr)) goto cleanup; // 更新当前线程 hr = DetourUpdateThread(GetCurrentThread()); if (FAILED(hr)) goto cleanup; // 安装钩子 hr = DetourAttach(&(PVOID&)OriginalFunction, HookFunction); if (FAILED(hr)) goto cleanup; // 提交事务 hr = DetourTransactionCommit(); if (FAILED(hr)) goto cleanup; // 其他程序逻辑... cleanup: DetourTransactionAbort(); DetourUninitialize(); return 0; }
4、消息循环事件接收和处理
CMessageLoop 接受的消息类型包括但不限于:
WM_CREATE:
表示窗口被创建。
WM_DESTROY:
表示窗口被销毁。
WM_PAINT:
表示需要重新绘制窗口。
WM_SIZE:
表示窗口大小改变。
WM_MOVE:
表示窗口位置改变。
WM_COMMAND:
表示菜单选择、按钮按下等。
WM_NOTIFY:
表示控件发出的通知。
WM_TIMER:
表示定时器事件。
WM_KEYDOWN 和 WM_KEYUP:
表示键盘键按下和释放。
WM_LBUTTONDOWN 和 WM_LBUTTONUP:
表示鼠标左键按下和释放。
WM_RBUTTONDOWN 和 WM_RBUTTONUP:
表示鼠标右键按下和释放。
WM_MOUSEMOVE:
表示鼠标移动。
WM_CLOSE:
表示关闭窗口。
WM_QUIT:
表示应用程序退出。
5、主框架窗口函数 MainFrame
CreateEx窗口创建,并返回句柄;事件响应,如点击鼠标,关闭窗口;