0

当我的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是 true 并且GetLastError()= 183 错误(“当该文件已存在时无法创建文件。 ”)发射!

问题:我能做什么?我所需要的只是隐藏那个控制台窗口。

请帮我解决这个问题。

十分感谢!

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

4

3 回答 3

4

只需调用FreeConsole()摆脱它并AllocConsole()创建一个新的。

于 2011-05-23T11:49:23.580 回答
2

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

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

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

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

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

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

于 2011-05-23T11:45:30.757 回答
0

它是调用进程,它决定你是否有一个控制台。

Windows 资源管理器仅为控制台应用程序创建一个,尽管使用用户帐户运行的计划任务总是有一个。

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

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

于 2021-01-09T11:13:22.573 回答