Скрытие консоли в виндовс

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Скрытие консоли в виндовс

Сообщение Сквозняк » 07.10.2019 17:43:26

Есть ли какая-то функция, в которой можно было указать, что если у приложения вылезет консоль, то пусть она будет свёрнута и не лезет на экран?
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Vadim » 08.10.2019 06:33:15

Сквозняк
Если совсем-совсем-совсем внутри, то можно отловить хэндл окна и с помощью WinAPI дать ему команду "скройся с глаз моих". А вообще, при запуске приложения, в параметрах ярлыка это указывается. А если сделать службу, то и никакой консоли не будет вылазить.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 08.10.2019 14:30:12

Как не хочется ради каждого чиха службы плодить или диспетчер задач напрягать. Это звиздец какой-то в винде творится.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 08.10.2019 15:01:40

В винде консолью пользуются только админы и красноглазики-линуксойды. :D
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Vadim » 08.10.2019 15:47:21

Снег Север писал(а):... и красноглазики-линуксойды.

Позвольте представиться, это я... ;-) :D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Скрытие консоли в виндовс

Сообщение Дож » 08.10.2019 20:26:32

Что мешает написать приложение так, чтобы из него самопроизвольно не вылезала консоль?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 09.10.2019 23:54:09

Снег Север писал(а):В винде консолью пользуются только админы и красноглазики-линуксойды. :D


В винде консоль вылезает сама, и чтобы её скрыть, используются различные костыли разной степени извращённости.

Добавлено спустя 7 минут 13 секунд:
Дож писал(а):Что мешает написать приложение так, чтобы из него самопроизвольно не вылезала консоль?


А есть чёткие критерии, что нужно сделать чтобы она не вылезала? Пишешь себе пишешь, всё работает хорошо, а потом в очередной раз портируешь в винду и привет, полезли консоли. Это какая-то голимая виндопроблема спровоцированная мелкософтом. В винде даже нельзя пнуть напрямую не запускающую бинарь команду в систему не запустив командный интерпретатор, который выведет на экран чёрное окошко.

Иногда программа должна перезапустить сама себя с определёнными ключами, сделать это проще всего послав команду в систему. А там и консоль вылезет.

Добавлено спустя 1 час 26 минут 50 секунд:
У дельфистов таже проблема и кое-какая пилюля для этого есть:
https://stackoverflow.com/questions/13056642/delphi-hide-console-window
Код: Выделить всё
$APPTYPE CONSOLE}

uses
  Windows,
  SysUtils;

function GetConsoleWindow: HWND; stdcall; external kernel32;


begin
  try
    Writeln('Press enter to hide console the window');
    Readln;
    //hide the console window
    ShowWindow(GetConsoleWindow, SW_HIDE);

    //do something
    Sleep(5000);

    Writeln('Press enter to exit');
    //show the console window
    ShowWindow(GetConsoleWindow, SW_SHOW);
    Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.


Пример сокращается до
Код: Выделить всё
uses
JwaWinCon, Windows;

begin
writeln('12345');
ShowWindow(GetConsoleWindow, SW_HIDE);
writeln('222222222222222');
end.


После короткого теста в вайне заметно что от вызова
Код: Выделить всё
ShowWindow(GetConsoleWindow, SW_HIDE);
эффект есть. Будут ли вредные побочки, станет известно после более тщательного тестирования.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Дож » 10.10.2019 02:32:52

А есть чёткие критерии, что нужно сделать чтобы она не вылезала?

Вызывать только те функции и программы, которые не создают своих терминалов.

В винде даже нельзя пнуть напрямую не запускающую бинарь команду в систему не запустив командный интерпретатор, который выведет на экран чёрное окошко.

Вам необходимы эти команды?

Иногда программа должна перезапустить сама себя с определёнными ключами, сделать это проще всего послав команду в систему. А там и консоль вылезет.

Я запускал, у меня не вылезает.

У дельфистов таже проблема и кое-какая пилюля для этого есть:

Вы в коде объявляете APPTYPE CONSOLE, чтобы сразу же скрыть эту самую консоль? Нельзя ли по-проще, ну там, APPTYPE GUI?

Побочный эффект заключается в том, что если пользователь запускает вашу программу из своего любимого терминала, например, FAR Manager, то его любимый терминал будет скрыт, и пользователь заслужено возненавидит вашу программу за кривое поведение и невозможность прожать Ctrl+C в случае чего.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 10.10.2019 02:46:28

Дож писал(а):Вызывать только те функции и программы, которые не создают своих терминалов.


Это замечательно! Куча кода и куча зависимостей и теперь всех нужно проверять штангенциркулем на соответствие виндовой расе. А заменять не прошедших отбор чем?
Дож писал(а):Вам необходимы эти команды?


Там консоль лезет и с теми командами, что ищутся в тырнете и справках.

Дож писал(а):Я запускал, у меня не вылезает.


Хелловорды рулят и педалят. На оторванных от реальности примерах...

Дож писал(а):Вы в коде объявляете APPTYPE CONSOLE, чтобы сразу же скрыть эту самую консоль? Нельзя ли по-проще, ну там, APPTYPE GUI?


Я такого лично вообще не объявляю. Если где-то в зависимостях или редактор втихаря такое объявляет, то это вопрос не ко мне. Поиск не обнаружил в моём коде слова APPTYPE. В паскале ничего такого объявлять необязательно, посему и знать таких ключей до сегодняшнего дня не знал. Это дельфисты таким пользуются.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Дож » 10.10.2019 03:45:12

Это замечательно! Куча кода и куча зависимостей и теперь всех нужно проверять штангенциркулем на соответствие виндовой расе.

Да. Чтобы не попадать в такие печальные ситуации, нужно проверять, что используемые вами зависимости соответствуют поставленным требованиям.

Если вы хотите, чтобы ваша программа работала в Windows без костылей, нужно писать код в соответствии с API этой операционной системой, а не в соответствии с API от какой-то другой ОС (это должно быть очевидно).

А заменять не прошедших отбор чем?

Это неконструктивный вопрос, на него не может быть дан полезный ответ. (Но в утешение могу сказать, что в моей хеллоу ворлд программе я нашёл нужные замены, поэтому на 100% уверен, что и у вас всё получится.)

Хелловорды рулят и педалят. На оторванных от реальности примерах...

Вы выше написали "Хелловорд всегда глючит", а я написал безглючную версию. Вашей нереально сложной системы из реального мира с кучей зависимостей я всё равно не вижу, я вижу только ваши утверждения на форуме, и некоторые из них не соответствуют действительности.

Я такого лично вообще не объявляю.

Лично вы нет, зато цитируете чужой код, который объявляет. Кроме того, если не указывать тип приложения, то по умолчанию FPC действует так, как будто бы вы объявили {$APPTYPE CONSOLE}. Поэтому вы объявляете {$APPTYPE CONSOLE}, хотели вы того или нет.

В винде у приложений есть тип -- он может быть GUI или CONSOLE -- и в зависимости от этого типа приложение ведёт себя немного по-разному. Одно из таких различий: если бы вы скомпилировали программу с директивой {$APPTYPE GUI}, то ваше приложение запускалось бы без консоли с самого начала (и без всяких SW_HIDE).
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 10.10.2019 05:11:58

Дож писал(а):Если вы хотите, чтобы ваша программа работала в Windows без костылей


У меня нет таких глупых желаний. Программа должна работать хорошо, а как она будет это делать в системе, в которой не всё спланировано по уму, это уже детали, которые не всем интересны.
Дож писал(а):Вы выше написали "Хелловорд всегда глючит"

Это вы такую фразу написали. Если пишете по русски, то хотя-бы смысл прочитанного не искажайте в соответствии с переводом на другой язык, в котором отсутствуют многие слова и понятия. Да, по русски можно и на дворовом сленге сказать такое, что и в академической среде на другом языке, без тонны уточнений и при условии что смысл будет хорошо понят, не получится выразить. И вы мне только что говорили АПИ винды соблюдать, а сами с АПИ русского так поступаете.
Дож писал(а):Лично вы нет, зато цитируете чужой код, который объявляет.

Это цитирование дано лишь для собирания всей необходимой информации в одном месте, поскольку это больной вопрос и на этом форуме никто из посетивших тему скрывать консоль больше не научил. А у дельфистов и дотнетчиков на аналогичных темах форумов их рецепты обнаружились. По поводу скрытия консоли сразу после запуска приложения почему-то никто не парился. Ну а SW_HIDE нисколько не мешает, если покажет хорошие результаты при тестах в реальной винде.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Дож » 10.10.2019 05:28:35

Это цитирование дано лишь для собирания всей необходимой информации в одном месте

Вы процитировали кривой костыль, которого не должно быть в правильно написанной программе. Так понятнее?
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Сквозняк » 10.10.2019 08:20:20

Дож писал(а):Вы процитировали кривой костыль, которого не должно быть в правильно написанной программе. Так понятнее?


Кривой костыль, это то, как реализована система с консолью в виндовсе. Не пользуйтесь виндой, если не приемлете эффективных решений, а желаете лишь абсолютно правильные.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Скрытие консоли в виндовс

Сообщение Дож » 10.10.2019 09:52:14

Я рад, что вы не отрицаете моего утверждения и согласны с тем, что из нормального и костыльного решения задачи выбрали костыльный. Странно при этом, что пеняете на винду, а не на свой подход.

Советом вашим, разумеется, не воспользуюсь.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Скрытие консоли в виндовс

Сообщение Снег Север » 10.10.2019 10:11:49

Сквозняк, я не понимаю на что вы жалуетесь. Вы написали консольное приложение и у него вылезает консоль. А как может быть еще?
Вы бы еще пожаловались, что в в дождь с неба вода капает... :D

Кстати, элементарно гуглится пример для делфи, как перенаправить консольный вывод другой программы, запускаемой из приложения, в какой-нибудь StringList. Я сам таким пользовался, когда мне надо было перехватывать такие сообщения от ffmpeg.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20

Рейтинг@Mail.ru