如何在后台制作C ++程序进程,直到计算机关闭?

时间:2014-02-08 08:46:31

标签: c++ windows

  • Windows:

    1. 是否可以在没有任何Console或GUI显示的情况下在后台执行C ++程序?而且,怎么样?

    2. 如何在计算机关闭之前进行处理?

    3. 如果在此程序处于活动状态时如何维护正在执行的功能,请

IDE:Visual Studio 2013

3 个答案:

答案 0 :(得分:18)

第1步:如果您使用的是IDE,那么在项目创建过程中,它很可能会询问“console-app”与“window-app”。选择window-app,这意味着它将在不打开控制台的情况下启动。

enter image description here enter image description here

第2步:现在,您的IDE可能会在代码中生成一些使Window可见的代码。删除该代码:

enter image description here

您的程序现在正在运行,但在任务栏上看不到:

enter image description here

要运行自己的代码,您有2个选项。哪个适合取决于您的情况,但第二个通常是首选:

  • 使用WinMain之类的生成方法之一启动自己的方法,该方法应该包含一个循环,并在该循环中使用代码加上对Sleep()的调用。

  • 使用windows-messages按需运行部分代码。 (的优选

程序将一直运行,直到您的计算机关闭;然后它将不再运行。


关于何时使用选项1与选项2的几点说明:

选项2 通常被认为更好,因为它与操作系统(Windows)一起工作,它只在操作系统告诉它发生了某些变化时执行代码。另一方面,选项1 不依赖于Windows消息 - 有时您需要这种独立性。它的代价是:你的代码可能会“手动”检查是否有变化,有时会做某事,但大部分时间都选择Sleep()。这被称为->polling btw。所以更喜欢选项2。


这就是如何修改选项2-apps的WndProc 。示例:每秒发出一声哔声。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    switch (message)
    {
    #define IDT_TIMER1 123 // todo find out which numbers are allowed
                           // which depends on windows AND your organization
    case WM_CREATE:
        SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC) NULL);
    break;
    case WM_TIMER: 
        switch (wParam) { 
        case IDT_TIMER1:
            Beep(100,50);
        break;
        }
    break;
    case WM_COMMAND:
    ...

答案 1 :(得分:2)

为此,您需要隐藏窗口。

对于控制台:ShowWindow (GetConsoleWindow(), SW_HIDE);

对于Win32项目:要么不使用CreateWindowCreateWindowEx创建窗口,要么ShowWindow(hWnd, SW_HIDE)


或者是最佳解决方案,您可以创建服务some sample

答案 2 :(得分:0)

这是隐藏窗口的方法:

void main() {
    HWND window;
    AllocConsole();
    window = FindWindowA("ConsoleWindowClass", NULL);
    ShowWindow(window, 0);
    //close program when Esc pressed
    if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
        return 0;
    }
}