创建不带窗口的应用程序

Create an Application without a Window

本文关键字:应用程序 窗口 创建      更新时间:2023-10-16

如何编程一个可以在不打开窗口或控制台的情况下运行的C/C++应用程序?

当您编写WinMain程序时,您会自动将/SUBSYSTEM选项设置为编译器中的窗口。(假设您使用Visual Studio)。对于任何其他编译器,可能存在类似的选项,但标志名称可能不同。

这导致编译器以可执行文件格式(PE格式)创建一个条目,将可执行文件标记为windows可执行文件。

一旦这些信息出现在可执行文件中,启动程序的系统加载程序就会将二进制文件视为windows可执行文件,而不是控制台程序,因此在运行时不会导致控制台窗口自动打开。

但是,如果不需要的话,windows程序不需要创建任何窗口,就像你在任务栏中看到的所有程序和服务一样,但看不到任何相应的窗口。如果你创建了一个窗口但选择不显示,也可能发生这种情况。

要实现这一切,你所需要做的就是

#include <Windows.h>
int WinMain(HINSTANCE hInstance,
            HINSTANCE hPrevInstance, 
            LPTSTR    lpCmdLine, 
            int       cmdShow)
    {
    /* do your stuff here. If you return from this function the program ends */
    }

您需要WinMain本身的原因是,一旦您将子系统标记为Windows,链接器就会假设您的入口点函数(在程序加载和C Run TIme库初始化后调用)将是WinMain,而不是main。如果您不在这样的程序中提供WinMain,则在链接过程中会出现未解决的符号错误。

在窗口中:

#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // <-- Program logic here
    return 0;
}   

请务必使用Adam Mitz提到的/SUBSYSTEM链接器开关。

在其他平台上:

int main(int argc, char**argv)
{
  // <-- Program logic here
  return 0;
}

如果你需要在没有控制台或窗口的情况下连续运行程序,你可能会在*NIX或Windows上的服务上找到有用的deamon,这个.NET示例如果你需要普通的win32,只需在谷歌上搜索一点示例
由于你的问题被标记为win32,我认为服务对你来说更重要。

这也处理消息:

#include <windows.h>
#include <stdio.h>
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MSG msg;
    DWORD curThreadId;
    curThreadId = GetCurrentThreadId();
    // Send messages to self:
    PostThreadMessage(curThreadId, WM_USER, 1, 2);
    PostThreadMessage(curThreadId, WM_USER+1, 3, 4);
    PostThreadMessage(curThreadId, WM_USER+2, 5, 6);
    PostThreadMessage(curThreadId, WM_USER+3, 7, 8);
    PostThreadMessage(curThreadId, WM_QUIT, 9, 10);
    while (GetMessage(&msg, NULL, 0, 0)) {
        printf("message: %d; wParam: %d; lParam: %dn", msg.message, msg.wParam, msg.lParam);
    }
    return (int) msg.wParam;
} 

在Visual Studio Express 2010中,将子系统设置为windows(如用户17224所建议的)后,或者将main更改为WinMain(如用户172 24和Brian R.Bondy所建议的那样),可以在属性、链接器、高级、入口点中将entry函数设置为main:只需在文本框中键入main即可。

使用Visual Studio向导创建Win32应用程序。但不要创建窗口,即删除窗口创建功能。或者,我们可以创建Win Service应用程序。

如果使用MSVCVisual Studio,请使用新的项目向导并选择控制台应用程序