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窗口创建,并返回句柄;事件响应,如点击鼠标,关闭窗口;

 

posted on 2024-07-26 16:29  邗影  阅读(1)  评论(0编辑  收藏  举报

导航