繁体   English   中英

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

[英]How to create a win32 application without window in background with C?

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

  1. 如果可能,我希望该应用程序不应是 Windows 服务。

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

  3. 当应用程序运行时,我希望鼠标光标不要变成沙漏形状。 也就是说,在应用程序运行时不要打扰用户。 只需运行并默默退出。

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

如果可能的话,我希望这可以在 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);
    }
}

IIRC,您可以通过编写不创建或显示窗口或控制台的 WinMain 函数来完成此操作。 如果您希望您的程序能够从其他程序发送或接收消息,Lambert 关于使用消息循环的回答将对您有所帮助,但是如果您只是在进行简单的后台处理,那么您只需要一个 WinMain 就可以了窗口。

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

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 () 调用之前)同时等待您的 I/O和消息,以便您可以在有消息或 I/O 完成时收到通知。

警告

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM