如何用C在后台创建一个没有窗口的win32应用程序?

时间:2011-01-05 03:48:38

标签: c++ c background explorer hourglass

应用程序不需要任何窗口或控制台。如果可以删除控制台窗口或将其置于后台,它可以是控制台应用程序。应用程序将执行一些简单的任务(例如清理垃圾文件)并退出。

  1. 我希望应用程序不应该是Windows服务。

  2. 我希望可以在资源管理器窗口中双击启动应用程序并以静默方式运行。

  3. 当应用程序运行时,我希望不要将鼠标光标更改为沙漏形状。也就是说,在应用程序运行时不要打扰用户。只是静静地跑步和退出。

  4. 当Windows启动或用户登录时,不需要运行它。

  5. 我希望如果可能的话,可以在C中完成。我该怎么办?

    谢谢!

    更新: 现在好了。谢谢!

    
        task_finished = 0;
        CreateThread(NULL, 65535, task_thread, para, 0, NULL);
    
        MSG msg;
        while(!task_finished){
            while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                if(task_finished)
                    break;
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    

2 个答案:

答案 0 :(得分:2)

IIRC,您只需编写一个不创建或显示窗口或控制台的WinMain函数即可。 Lambert关于使用消息循环的答案将帮助您,如果您希望您的程序能够发送或接收来自其他程序的消息,但如果您只是进行简单的后台处理,那么您应该需要的是一个不能创建的WinMain窗口。

答案 1 :(得分:1)

您只需要一个消息循环 - 只需使用此代码(从here修改):

MSG msg;
BOOL bRet; 
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    } 
} 

编辑:

对于I / O或其他任务,您可以(1)创建另一个线程,并从那里执行所有操作,或者(2)在循环内使用MsgWaitForMultipleObjects(在下一个GetMessage之前( )call)同时等待你的I / O和消息,以便在有消息或你的I / O完成时通知你。

警告

我还没想出如何让应用程序在启动时不会出现沙漏形状。如果您需要该功能,请考虑改为创建Windows服务。您也可以编译为控制台应用程序,然后使用FreeConsole隐藏窗口。