创建没有窗口的应用程序

时间:2008-10-22 02:05:26

标签: c++ c winapi

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

7 个答案:

答案 0 :(得分:39)

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

这会导致编译器以可执行文件格式(PE format)创建一个条目,该条目将可执行文件标记为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,你将在链接过程中得到一个未解决的符号错误。

答案 1 :(得分:14)

在Windows中:

#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;
}

答案 2 :(得分:4)

如果您需要在没有控制台或窗口的情况下连续运行您的程序,您可能会发现有用的deamon on *NIXservices on Windows,这个.NET示例如果您需要简单的win32只需google一点点样本。
 由于您的问题标记为win32,我认为服务更适合您。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这还将处理消息:

#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: %d\n", msg.message, msg.wParam, msg.lParam);
    }

    return (int) msg.wParam;
} 

答案 6 :(得分:-8)

如果您使用 MSVC Visual Studio ,只需使用新的项目向导,然后选择控制台应用