首页 > 系统相关 >Windows窗口函数常规

Windows窗口函数常规

时间:2024-07-26 16:29:31浏览次数:8  
标签:窗口 Windows 句柄 WM 常规 hr 应用程序 NULL

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

 

标签:窗口,Windows,句柄,WM,常规,hr,应用程序,NULL
From: https://www.cnblogs.com/8335IT/p/18325479

相关文章

  • 如何在 Windows 10 中重置忘记的密码而不丢失数据
    面对电脑开机密码忘记的尴尬情况,许多用户可能会感到手足无措,尤其是对于那些依赖电脑进行日常工作和学习的人来说,这无疑是一个急需解决的难题。幸运的是,根据不同的操作系统(如Windows、macOS等),存在几种相对安全且有效的方法来重置或绕过开机密码,从而恢复对电脑的访问权限。以下,......
  • windows中MySQL迁移数据存放盘符位置
    由于刚开始安装mysq时都选择了默认安装,数据存放在了c盘,后面数据量过大c盘不堪重负,所以迁移数据到D盘windows中MySQL迁移数据存放盘符位置参考:https://blog.csdn.net/ZYX121799/article/details/136474869查看MySQL的数据存放位置showglobalvariableslike"%datadir%"......
  • 如何在 Windows 上配置 Java 开发环境
    配置Java开发环境是Java开发者的基础任务之一。本文将指导你如何在Windows操作系统上安装Java开发工具包(JDK)并设置相应的环境变量,确保你的开发环境能够正确编译和运行Java程序。第一步:下载和安装JDK访问JDK下载网站:前往Oracle官方网站或其他JDK提供商......
  • 开源项目tiny11builder对Windows11进行精简
    由于采用的是Powershell脚本,系统默认的策略是阻止运行的,需要以管理员身份运行Powershell后,输入以下命令:1Set-ExecutionPolicyunrestricted将「tiny11builder」解压,在文件“tiny11maker.ps1”上鼠标右键→使用PowerShell运行。   提前下载好官方原版W......
  • FlinkSQL窗口函数TUMBLE、SESSION 和 HOP的区别
    目录TUMBLE滚动窗口(TumblingWindow)SESSION会话窗口(SessionWindow)HOP滑动窗口(HoppingWindow)小结HOP窗口为什么不需要rowtime(事件时间) PROCTIME()vsrow_time 为什么HOP窗口常用PROCTIME()?总结TUMBLE、SESSION可以使用处理时间嘛TUMBLE窗口(滚动窗口)SESS......
  • windows bat脚本睡眠等待
    方法1:使用timeout命令在指定的时间内等待命令提示符或批处理脚本。时间以秒为单位定义。例如等待5秒钟使用。使用/T选项:c:/>timeout/T5您还可以直接指定秒,例如:c:/>timeout5上面的命令将在按任意键时中断超时过程。您可以使用/NOBREAK忽略按键并等待指定的时间。......
  • windows的nodejs版本控制工具:nvm nodejs以及vue的安装
    首先确保自己的电脑是首次安装nodejs相关的软件,安装nvm之前必须确保电脑无nodejs。1.nvm的安装在github上寻找合适的版本,我安装的是v1.12版本。Releases·coreybutler/nvm-windows·GitHubwindows下就下载如下图所示的nvm-setup.exe文件选择nvm的安装路径选择nodej......
  • windows11上MMDetection 3D环境准备
    在使用PyTorch准备环境并使用miniconda终端安装所需的所有软件包后,在验证安装过程的最后一步中出现错误。我创建了一个conda环境并激活了它,然后我安装了PyTorch以及使用MIM所需的所有软件包。MMEngineMMCVMMDetectionMMDetection......
  • 为什么我在 Windows 上使用 async 和 wait 时会收到 NotImplementedError 错误?
    我有这段代码:importosimporttimeimportasyncioasyncdefrun_command(*args):"""Examplefrom:http://asyncio.readthedocs.io/en/latest/subprocess.html"""#Createsubprocessprocess=awaitasyn......
  • .url 文件通常是指Windows操作系统中的一种快捷方式文件,用于创建指向网络资源或本地文
    .url文件通常是指Windows操作系统中的一种快捷方式文件,用于创建指向网络资源或本地文件系统路径的链接。这种文件类型实际上是文本文件,其内容格式类似于INI文件,包含了一个URL或者本地文件路径。主要特点和用途:创建快捷方式:.url 文件允许用户创建指向特定网页、FTP站点或本......