Как скрыть окно консоли с помощью WinAPI?

#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() .