首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在不使用WinMain的情况下编写Windows应用程序?

在不使用WinMain的情况下编写Windows应用程序,可以使用Windows API(应用程序编程接口)来实现。Windows API提供了大量的函数和方法,可以用于创建和管理窗口、处理消息、绘制图形等。以下是一个简单的示例,展示了如何使用Windows API创建一个简单的Windows应用程序。

  1. 首先,需要包含必要的头文件和库文件。在这个示例中,我们将使用Windows API的基本组件,如下所示:
代码语言:cpp
复制
#include<Windows.h>
  1. 接下来,定义一个窗口类结构体,用于描述窗口的属性和行为。在这个示例中,我们将创建一个名为“MyWindowClass”的窗口类,如下所示:
代码语言:cpp
复制
const char CLASS_NAME[] = "MyWindowClass";

WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc; // 窗口过程函数
wc.hInstance = hInstance; // 应用程序实例句柄
wc.lpszClassName = CLASS_NAME; // 窗口类名称
  1. 注册窗口类,使其可以在系统中使用。可以使用RegisterClass()函数来实现,如下所示:
代码语言:cpp
复制
if (!RegisterClass(&wc)) {
    MessageBox(NULL, "Failed to register window class.", "Error", MB_ICONERROR);
    return 1;
}
  1. 创建窗口。可以使用CreateWindow()函数来创建一个窗口,并返回窗口句柄,如下所示:
代码语言:cpp
复制
HWND hwnd = CreateWindow(
    CLASS_NAME, // 窗口类名称
    "My Window", // 窗口标题
    WS_OVERLAPPEDWINDOW, // 窗口样式
    CW_USEDEFAULT, // 初始x坐标
    CW_USEDEFAULT, // 初始y坐标
    CW_USEDEFAULT, // 宽度
    CW_USEDEFAULT, // 高度
    NULL, // 父窗口句柄
    NULL, // 菜单句柄
    hInstance, // 应用程序实例句柄
    NULL // 附加数据
);

if (!hwnd) {
    MessageBox(NULL, "Failed to create window.", "Error", MB_ICONERROR);
    return 1;
}
  1. 显示窗口。可以使用ShowWindow()函数来显示窗口,如下所示:
代码语言:cpp
复制
ShowWindow(hwnd, nCmdShow);
  1. 进入消息循环。应用程序需要一个消息循环来处理来自操作系统和其他应用程序的消息,如下所示:
代码语言:cpp
复制
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
  1. 定义窗口过程函数。窗口过程函数是一个回调函数,用于处理窗口消息。在这个示例中,我们将创建一个名为“WindowProc”的窗口过程函数,如下所示:
代码语言:cpp
复制
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }

    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

这个示例展示了如何使用Windows API创建一个简单的Windows应用程序,而不需要使用WinMain函数。当然,这只是一个简单的示例,实际开发中可能需要更多的代码和功能来实现更复杂的应用程序。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CC+的角角落落 第二辑 002

使用Windows API构建窗体应用 就历史来说,使用纯API开发窗体应用程序是上个世纪80年代以前的事情了,开发应用程序的人需要使用大量接近系统内核的API来完成应用程序的设计(当时C的版本还很低,...本文试图展示一下使用Windows API直接编写窗体类应用的核心内容,为之后关于Qt制作窗体应用的介绍以及一些别的有趣的东西做铺垫。 先从入口函数开始介绍。...当Windows操作系统启动一个程序之后,由编译器插入到可执行文件中的启动代码(之前还干了一堆事情,初始化各个段,初始化堆、栈等)调用WinMain函数启动应用程序。...我们使用Windows系统提供的API的方案进行消息处理。总共有两个消息队列,一个是应用程序的(进程的),另一个是窗体的。...现在我们有如此多的语言(Java、Python等)和相应的编译器,他们大多是基于API函数才能在Windows平台上施展拳脚(各类编译器在当前平台上使用C++加上Windows SDK编写编译),对底层有一定的了解可以让我们注意到那些语言和语法中更本质的内容

88750

VS2015 error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)”

kalman.cpp直接导入到新建的vs工程中进行编译,直接报错: 错误 LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void...) 1 经过网上查找问题,终于找到原因,是因为c语言运行时找不到适当的程序入口函数,一般情况下,如果是windows程序,那么WinMain是入口函数,就比如我这里创建的“win32项目” 如果是dos...控制台程序,那么main是入口函数,新建项目为“win32控制台应用程序” 而如果入口函数指定不当,很显然c语言运行时找不到配合函数,它就会报告错误。...相反,如果是windows程序,就按照相反的设置来配置即可,这里就不再赘述了。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

1.3K10
  • WINDOWS核心编程--Windows程序内部运行机制

    ---分派一个消息到窗口过程 PeekMessage windows应用程序的消息处理机制 编写窗口过程函数 匈牙利命名法 变量属性 属性部分: 类型部分: MFC、句柄、控件及结构的命名规范: Windows...窗口的创建 设计一个窗口类 windows给我们设计好了,只需要做填空,就能创建很好的类 结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性...此参数可取下列值之一: windows应用程序的消息处理机制 windows消息机制详解 编写窗口过程函数 匈牙利命名法 举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为...所提供的函数 Windows.h中新的命名规范: 类型&定义描述 WINAPI 使用在API声明中的FAR PASCAL位置,如果正在编写一个具有导出API人口点的DLL,则可以在自己的API中使用该类型...CALLBACK 使用在应用程序回叫例程,如窗口和对话框过程中的FAR PASCAL的位置 LPCSTR 与LPSTR相同,只是LPCSTR用于只读串指针,其定义类似(const char FAR

    1.5K50

    为了分析WebRTC, 重学Windows开发

    如鼠标消息、键盘消息,Timer消息,窗口的创建与消毁等等。那么,Windows程序是在哪儿处理消息呢?是否掌握了它,就控制了Windows程序的核心呢?答案是肯定的,它就是 WndProc 函数。...对于 Windows 程序就是这样,它就不使用 main 而换作了 WinMain 作为程序入口点。...如 窗口创建时发送的 WM_CREATE 消息,如果我们不处理它,Windows 操作系统就不会显示创建的窗口。 但 Windows 中有那么多消息,我们每个都处理企不是要累死人?...hInstance :窗口句柄,与WinMain中的一样。 hIcon :窗口图标。如果是NULL,使用默认图标。 hCursor :设置光标样式。...然后对一个最简单的 Windows程序做了剖析,指出通过 6 大步可以创建出一个最简单的 Windows程序,它们分别是: 设置入口点,WinMain。 创建 WinProc 函数。 注册窗口类。

    1K10

    【VC++】字符串详解&窗口&第一个windows程序

    invite_code=1noqb14tvyjrm 系统调用顺序对比 windows没开放源码,所以要在封装一层API,不是像 Linux 那样直接使用系统调用 应用程序在 Linux 和 Windows...因为 Windows 操作系统支持多语言,如果使用 ANSI 版本,它将无法支持应用程序的本地化 ANSI 版本的接口效率更低,因为其内部需要进行编码转换。...TCHARs 如果你的程序需要同时支持多款操作系统,如:Windows NT、Windows 95、Windows 98 和 Windows Me。...该参数代表被加载到内存的可执行程序(exe文件)。某些 Windows API 可能需要该参数。如:加载图标或者加载位图等等。...实际情况下,在微软的 C 运行时库(CRT)中提供了一个 main 函数实现,其内部会调用 WinMain 或者 wWinMain。

    33910

    游戏编程之二 windows编程基础

    窗口消息中定义的第一个参数是消息所关联的窗口句柄。   在编写Windows应用程序的时候经常使用句柄。...Windows应用程序的组成    在开发Windows应用程序的过程中有一些重要的步骤:   *用C语言编写WinMain()函数和相关的窗口函数,或者在C++中使用基础类,比如CWinApp等。...Windows应用程序中创建并使用绘画对象,如自定义画笔、刷子和字体等。...窗口消息中定义的第一个参数是消息所关联的窗口句柄。   在编写Windows应用程序的时候经常使用句柄。...Windows应用程序的组成   在开发Windows应用程序的过程中有一些重要的步骤:   *用C语言编写WinMain()函数和相关的窗口函数,或者在C++中使用基础类,比如CWinApp等。

    7110

    Win32对话框程序(2)

    *********** WinMain函数 Win32对话框程序(1)中说了WinMain是应用程序的入口,其输入参数有四个,根据MSDN上的叙述: 输入变量声明 说明 HINSTANCE    hInstance...因为WinMain是应用程序的入口,即程序运行的第一个函数,所以这四个参数应该是操作系统传给WinMain的,至于操作系统是怎么把他们传进来的,现在没管~@_@~     何为句柄?...如果我们同时运行两个记事本程序,我们会发现针对它们的不同操作是互不干扰的,这两个“窗口”即使记事本的两个实例,它们被加载在内存中的不同空间,但为了实现互不干扰的操作和处理,我们需要区分彼此,便使用句柄来标识应用程序的不同实例...lpCmdLine是不包含程序名的命令行,根据MSDN使用函数GetCommandLine()也可返回命令行字符串,不过会包含程序名。...此外,入口函数名并不一定是WinMain,也可以是main(),但需要在main函数体内显示的调用类似GetCommandLine()这样的函数来引入WinMain的四个参数并作为变量(后面需要使用),

    1.2K30

    C加加游戏编程,大神十年的绝技,正确的入门,这才叫学习

    MicrosoftDirectX是这样一组技术:它们旨在使基于Windows的计算机成为运行和显示具有丰富多媒体元素(例如全色图形、视频、3D动画和丰富音频)的应用程序的理想平台。...DirectX包括安全和性能更新程序,以及许多涵盖所有技术的新功能。应用程序可以通过使用DirectX API来访问这些新功能。...学编程最重要的是实践,就是写代码、看别人写的代码、再写代码,你看再多的书,不写代码,你还是不会编程。...5.动手写一个窗口 在Windows中使用Direct3D创建Win32窗口非常简单。要创建一个Win32窗口就必须拥有一个WinMain函数(这不是废话是什么)。...相关的层出不穷,也能够挑选刚发行不久的新书,毕竟上面讲的常识比较前沿与更具老练性。

    1.8K61

    【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”

    读本系列博文的读者必须具备以下的知识储备: C/C++语言基础语法及了解面向对象概念 窗口在 Windows 中指一个矩形区域,一般情况下这个区域是用户与应用程序交互的枢纽;上一小节使用 MessageBox...我们使用 WinMain作为程序的入口函数: #include windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance...窗口处理指针:为指向窗体的的过程函数,为指针,使用 WndProc 处理应用程序在发生事件时从 Windows 接收的消息,以下将会讲解 WndProc cbClsExtra 窗口类结构后的附加字节数...例如,如果用户在应用程序中选择"确定"按钮,Windows 会向您发送消息,您可以在WndProc函数内编写代码,执行任何适当的操作。 这称为处理事件。 您只处理与应用程序相关的事件。...Windows 用于使应用程序与图形子系统通信的数据结构。

    1.1K20

    VC++6.0入门——第一讲,认识VC++6.0,新建工程等

    引出VC++6.0入门——第一讲,认识VC++6.0,新建工程等第一讲笔记接触过Windows编程方法的读者都知道,在应用程序中有一个重要的函数WinMain,这个函数是应用程序的基础。...当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数(实际是由插入到可执行文件中的启动代码调用的)。...WinMain是Windows程序的入口点函数,与DOS程序的入口点函数main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束。...DC是一个包含设备(物理输出设备,如显示器,以及设备驱动程序)信息的结构体,在Windows平台下,所有的图形操作都是利用DC来完成的。...3出现一个工程信息窗口,单击【OK】按钮,这样就生成了一个空的应用程序外壳。4.这样的应用程序外壳并不能做什么,甚至不能运行,我们还要为它加上源文件。

    20220

    【Qt源码笔记】万般皆是int main

    经常写 Qt 的程序,就会发现,不管是写控制台程序还是带窗体的应用程序,在 Qt 中的入口都是int main()。但实际上抛开其他平台不说,就是在 Windows 平台上,二者的入口就是有区别的。...就拿带窗体的应用程序来说,已知它的入口只能是WinMain、wWinMain、_tWinMain。不难按图索骥找到 qtmain_win.cpp 这个文件。..., char **); extern "C" int main(int, char **); /* WinMain() - Initializes Windows and calls user's...& argv[i]; ++i) delete [] argv[i]; delete [] argv; return exitCode; } 这个文件中不难看出,我在自己的工程中使用的...翻看目录时候 winmain.pro 引起了我的注意,根据它的内容不难发现,这个目录在 Windows 下编译会生成 qtmain.lib 。机智的我直接去找项目工程文件( .vcxproj )。

    67540

    游戏编程之三 DirectX SDK简介

    传统上,WINDOWS.H是所有C语言编写的Windows应用程序必需的一部分。当在C++中使用基础类库时,WINDOWS.H包括在AFXWIN.H头文件中。...Windows应用程序的组成    在开发Windows应用程序的过程中有一些重要的步骤:   *用C语言编写WinMain()函数和相关的窗口函数,或者在C++中使用基础类,比如CWinApp等。...Windows应用程序中创建并使用绘画对象,如自定义画笔、刷子和字体等。...窗口消息中定义的第一个参数是消息所关联的窗口句柄。   在编写Windows应用程序的时候经常使用句柄。...Windows应用程序的组成   在开发Windows应用程序的过程中有一些重要的步骤:   *用C语言编写WinMain()函数和相关的窗口函数,或者在C++中使用基础类,比如CWinApp等。

    15200

    LNK2019 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void) (?invoke_main@@YAHXZ) 中被引用

    这个报错网上查了很多,大概原因是: c语言运行时找不到适当的程序入口函数, 一般情况下,如果是windows程序,那么WinMain是入口函数,在VS中新建项目为“win32项目” 如果是dos控制台程序...程序,略 若这两项配置是对的,然依然有这个问题,问题在于,如果是MFC项目的话 需要在属性\常规\MFC的使用 中 要选择 【在静态库中使用MFC】 若是win32的话则选择【使用标准windows库】...WinMain()做为函数入口(主函数); 反之也一样,创建项目时,选择了win32项目,而把代码当win32控制程序写了,即代码里面使用main()做为函数入口(主函数); 所以出现了以上报错,意思就是主函数和当前项目不匹配...因为空工程不包含任何的源代码文件,接下来你只需要在相应的源代码文件夹和头文件文件夹加入相应的.cpp和.h文件即可。...Win32项目:初始代码模版实现一个简单的windows窗口,以WinMain作为程序入口,引用了win32Api头文件和库,链接器subsystem参数为windows,所以生成的程序不带黑色的控制台

    17.2K51

    让vc编译出的程序减小体积

    二,设置自己的入口点函数 C或C++程序默认的入口函数是main()或WinMain(),但我们现在不用什么Main,WinMain.因为这些都不是直接的入口点,编译器在产生exe文件的时候,将为我们生成真正的入口点....下面我们来定义自己的入口函数,具体是把main或WinMain改成其它的名字(如MyFun),打开"Project(工程)--->settings(设置)"选项,选中"link"选项卡,在"Category...6.0) // 没有做任何优化情况下,编译大小为:16K // 编译优化后: 1K (用16进制编辑器把尾部的0x00去掉: 712bytes) #include windows.h> #pragma...) // 作用: 指定入口函数 // 子系统为windows的默认入口点WinMain和console的默认入口点main,都会引入 #pragma comment(linker, "/ENTRY:main...,不压入RunDllW的函数参数,直接调用.

    2.1K10

    程序的入口

    操作系统装载应用程序后,做完初始化工作就转到程序的入口点执行。程序的默认入口点由连接程序设置, 不同的连接器选择的入口函数也不尽相同。...,WinMainCRTStartup 调用你自己写的 WinMain 函数。...具体设置哪个入口点是由连接器的“/subsystem:”选项确定的,它告诉操作系统如何运行编译生成的.EXE文件。可以指定四种方式:CONSOLE|WINDOWS|NATIVE|POSIX。...如果这个选项参数的值为 WINDOWS,则表示该应用程序运行时不需要控制台,有关连接器参数选项的详细说明请参考 MSDN 库。...以下四种组合,可以实现console和windows模式的混合,可以达到不弹出DOS窗口的效果,也可以达到在Windows程序中向控制台输出printf信息的目的。

    1.7K90

    MFC原理第二讲.MFC的初始化过程

    这一节主要就是讲解Winmain在哪里. 以及为什么全局应用程序对象要初始化. 也就是我们的theApp这个变量. 也就是MFC的初始化过程. 二丶Winmain查找.   ...因为theApp是应用程序对象.会广泛使用.定义为全局则是在Winmain之前已经初始化好了....应用程序截图: ? 所以说.TheApp应用对象数据在main之后经常使用.所以必须编写....四丶MFC初始化过程代码编写   上面我们已经将该有的类.该继承的类已经写好了.现在我们就可以写自己的类模拟了.   1.首先需要InitInstance这个虚函数....为什么还需要第二个 m_pCurApp指针.原因是 MFC在调用的时候.不能直接使用     theApp. 而是通过一个函数 AfxGetTheApp来获取的.

    1.1K52

    windows程序设计第五版_程序设计中三种基本结构

    结构WNDCLASS包含一个窗口类的全部信息,也是Windows编程中使用的基本数据结构之一,应用程序通过定义一个窗口类确定窗口的属性 基本信息 要得到某一窗口的WNDCLASS数据,可以用GetClassLong...> //包含应用程序中数据类型和数据结构的定义 long CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口说明 //WinMain函数是所有Windows应用程序的入口...,类似c语言中的main函数 其功能是完成//一系列的定义和初始化,并产生消息循环 /* WinMain函数实现以下功能:注册窗口类,建立窗口及执行其他必要的初始化工作;进入消息循环,根据从应用程序消息队列接受的消息...Windows系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类// 窗口类必须先注册 后使用 if(!...如果不指定该风格,则这两个 hInstance 必须相同。

    47810

    连接器工具错误lnk2019_2019年十大语文错误

    文章目录 可能的原因 1.不编译包含符号定义的源文件 2.未链接包含符号定义的对象文件或库 3.符号声明的拼写与符号的定义不同 4.使用了函数,但是参数的类型或数量与函数定义不匹配 5.已声明但未定义函数或变量...:::no-loc(static):::未定义类的成员 9.生成依赖项仅在解决方案中定义为项目依赖项 10.未定义入口点 11.使用 Windows 应用程序的设置生成控制台应用程序 12.尝试将64位库链接到...10.未定义入口点 应用程序代码必须 :::no-loc(main)::: :::no-loc(wmain)::: 为控制台应用程序和 :::no-loc(WinMain)::: 或 :::no-loc...(wWinMain)::: Windows 应用程序定义适当的入口点。...11.使用 Windows 应用程序的设置生成控制台应用程序 如果错误消息类似于函数function_name ** :::no-loc(extern)::: :::no-loc(WinMain):::

    4.1K20

    exit是什么意思(TerminateProcess)

    每个应用程序都有个主函数,在WINDOWS下,只支持两种类型的应用程序——CUI(控制台应用程序)和GUI(图形界面应用程序),相应的,其主函数类型不同。...,后两个为CUI的入口函数;事实上,在一个进程开始运行时,WINDOWS OS并不直接从主函数开始执行,而是从另外 一个比较大的运行期启动函数开始执行,不同的入口函数对应的启动函数不同: 应用程序类型...进入点 嵌入可执行文件的启动函数 需要ANSI字符和字符串的GUI应用程序 WinMain WinMainCRTStartup...wmain wmainCRTStartup 启动函数负责对应用程序运行前期的初始化,如全局变量的内存分配等。...如果我们在编写应用程序时,打算终止当前进程,我们该调用哪个函数?答案是:三者其实都一样!

    57520
    领券