当我的 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 ++)
答案 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()
。