如何使用WinAPI隐藏控制台窗口?

时间:2011-05-23 11:23:46

标签: c winapi showwindow

当我的 C 应用程序使用这个简单的 WinAPI 代码启动时,我正在尝试隐藏控制台窗口

#define CONSOLE_NAME "6FD66E14-FF0F-4B94-B8AF-AFE3D42DC399"

void hide_window(void)
{
    // Ставим заголовок для консольного окна / Setting window caption
    SetConsoleTitle(TEXT(CONSOLE_NAME));

    // Находим по заголовку Handle для окна / Searching Handle of the window
    HWND hWnd = FindWindow(NULL, TEXT(CONSOLE_NAME));
    if (hWnd == 0)
    {
        ErrorExit(TEXT("FindWindow"));
    }

    // Скрываем консоль / Hidding console
    ShowWindow(hWnd, SW_HIDE);
}

int _tmain(int argc, _TCHAR* argv[])
{
    hide_window();

    /* other code */
}

一切正常,如果没有激活防病毒软件,但是当卡巴斯基正在运行并监控系统时,我无法完成上述代码,因为hWnd == 0为真且{{ 1}} = 183 error(“当该文件已存在时无法创建文件。”)lauched!

问题:我该怎么办?我需要的只是隐藏控制台窗口。

请帮我解决这个问题。

非常感谢!

PS。使用Visual Studio 2010(Visual C ++)

3 个答案:

答案 0 :(得分:4)

只需致电FreeConsole()摆脱它,AllocConsole()即可创建一个新的。

答案 1 :(得分:2)

您最好根据“Win32 Project”而不是“Win32控制台应用程序”创建新的Visual Studio项目。然后将不会自动创建控制台。 (如果需要,您仍然可以在代码中创建一个。)这将设置/ SUBSYSTEM:WINDOWS编译器设置等。

必须在非控制台应用程序中创建GUI,并且您不必具有WndProc()函数。

回应“@Ian Goldby你能否给我链接到如何做到这一点的源代码?”

没有任何源代码。只需创建一个新的Visual C ++ Win32项目(而不是Win32控制台应用程序)。在向导中确保选中“Windows应用程序”。该向导将生成大量模板代码,但除了_tWinMain()函数的骨架外,您可以删除所有这些代码。这是应用程序启动时将调用的函数。只需将您自己的代码粘贴到此处即可。

或者,检查向导最后一个阶段的“清空项目”框,并提供您自己的main.c文件和您自己的_tWinMain()函数。您可能会发现这更容易。

无论哪种方式,您的应用程序将像以前一样运行,除了它,因为它是一个GUI应用程序而不是控制台应用程序,操作系统在启动时不会自动为它创建一个控制台窗口。 (所以显然像printf / scanf等功能不起作用。)

答案 2 :(得分:0)

是调用过程决定了你是否有控制台。

Windows 资源管理器仅为控制台应用程序创建一个,但 例如使用用户帐户运行的计划任务将始终有一个。

在这种特殊情况下,您需要结合前面的答案:

创建一个非控制台应用程序,此外您的 _tWinMain() 函数应调用 FreeConsole()