#c #winapi #showwindow
#c #winapi #показать окно
Вопрос:
Я пытаюсь скрыть окно консоли, когда мое приложение на 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 )
Комментарии:
1. Если удаление консоли не является вариантом, возможно, вы могли бы попробовать EnumWindows () и посмотреть, дает ли это другой результат при запущенной антивирусной программе?
Ответ №1:
Просто вызовите, FreeConsole()
чтобы избавиться от него и AllocConsole()
создать новое.
Комментарии:
1. Не могли бы вы прислать какой-нибудь код или, может быть, URL, где я могу прочитать об этом? Спасибо.
2. В этом нет ничего особенного, оба не принимают никаких параметров, и первые же хиты в Google предоставят вам достаточно подробной информации.
Ответ №2:
Вам было бы лучше создать новый проект Visual Studio на основе «Win32 Project» вместо «Консольного приложения Win32». Тогда консоль не будет создана автоматически. (Вы все еще можете создать его в коде, если хотите.) Это установит параметр /SUBSYSTEM: компилятор WINDOWS среди прочих.
Вам не нужно создавать графический интерфейс в неконсольном приложении, и вам не обязательно иметь функцию WndProc().
В ответ на «@Ian Goldby Не могли бы вы дать мне ссылку на исходный код, как это сделать?»
Исходного кода как такового нет. Просто создайте новый проект Visual C Win32 (не консольное приложение Win32). В мастере убедитесь, что выбрано «Приложение Windows». Мастер сгенерирует много шаблонного кода, но вы можете удалить все это, за исключением скелета функции _tWinMain(). Это функция, которая будет вызвана при запуске вашего приложения. Просто вставьте сюда свой собственный код.
В качестве альтернативы, установите флажок «Пустой проект» на последнем этапе мастера и укажите свой собственный файл main.c и свою собственную функцию _tWinMain(). Возможно, вам это покажется проще.
В любом случае, ваше приложение будет работать так же, как и раньше, за исключением того, что, поскольку это приложение с графическим интерфейсом, а не консольное приложение, ОС не будет автоматически создавать для него окно консоли при запуске. (Очевидно, что такие функции, как printf / scanf и т.д., Не будут работать.)
Комментарии:
1. Не могли бы вы дать мне ссылку на исходный код, как это сделать?
Ответ №3:
Это вызывающий процесс, который решает, есть ли у вас консоль.
Проводник Windows создает его только для консольных приложений, хотя, например, запланированные задачи, которые выполняются с учетной записью пользователя, всегда будут иметь его.
В этом особом случае вам нужно объединить предыдущие ответы:
Создайте неконсольное приложение и, кроме того, ваша _tWinMain()
функция должна вызывать FreeConsole()
.