Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Спрятать окно до того как оно отобразилось на экране (http://forum.oszone.net/showthread.php?t=183743)

Sanchos 24-08-2010 17:58 1480876

Спрятать окно до того как оно отобразилось на экране
 
В общем суть вопроса такова:
Есть утилита, которая никак не реагирует на запуск себя как HIDE. Она всё время запускается видимая и с активным фокусом.
Если применить ShowWindow hwnd, SW_HIDE сразу после запуска, тогда видно моргание окна, то есть оно сначала появляется и тут же прячется.
Нужно как то "спрятать" его сразу после запуска, но до того как окно отобразится... говорят что можно сделать хук на это дело.
Правда ли это, и если можно то как именно?

Casper-SC 24-08-2010 21:03 1480955

Я вот тоже искал ответ на этот вопрос. Но или ярано перестал искать или просто посчитал вполне возможным сделать так:
Просто делаю, чтобы форма не отображала своё присутствие на панели задач, и имела координаты на экране по оси Х: -ширина формы -10 (десять с потолка на всякий случай).

C#
Проверено, работает:
Код:

        public Form1()
        {
            InitializeComponent();
            this.ShowInTaskbar = false;
            this.StartPosition = FormStartPosition.Manual;
            this.Left = -this.Width - 10;
        }

Какая разница как прятать, главное работает. да и антивирус явно не заругается.

ganselo 24-08-2010 21:28 1480970

Можно перехватить API функцию, которая создаёт окно и выставить ей флаг SW_HIDE. Некоторые антивирусы могут ругатся на такое, т.к. большинство вирусов используют перехват API.

Sanchos 24-08-2010 23:37 1481044

Знать бы ещё какие функции перехватывать и самое главное КАК ))))

Admiral 25-08-2010 12:56 1481297

Sanchos CreateProcess() - создать (запустить) процесс с атрибутом wShowWindow в STARTUPINFO равному SW_HIDE. Консольные программы при этом даже не показываются, есть шанс что и данная оконная утилита поведёт себя так же.

Sanchos 25-08-2010 13:56 1481353

Я пробовал через CreateProcess(), в этом случае возникает куча ошибок в самом приложении.

RUVATA 26-08-2010 09:52 1481968

что за утилита, есть исходники?

.StartInfo.UseShellExecute = False
пробовал?

Sanchos 26-08-2010 16:08 1482249

Какие исходники? )))) утилита сторонняя, к тому же является частью недешёвой программы.
Называется BarCode Vizard
.StartInfo.UseShellExecute = False это где пробовать?

Admiral 29-08-2010 02:03 1483895

Sanchos, а если через эту программу запустить Скрытный запуск приложений (NB: скрытно - значит без промелькиваний)?
p.s.
В архиве присутствует исходный код.

Sanchos 30-08-2010 18:10 1485027

Спасибо за ссылку. Крутил я эту прогу и так и сяк. Запускать запускает, но всё как обычно.
И ещё, после недавних тестов, отказался от ShowWindow hWnd, SW_HIDE. Почему то на ХР с ним заметно тормознее отсылаются команды приложению. А порой и вообще подвисает.

RUVATA 03-09-2010 15:52 1487935

.StartInfo.UseShellExecute
например:
Код:

        MyProcess.StartInfo.FileName = "7z"
        '          StartInfo.FileName  - если приложение не описанно в sys.переменной PATH,
        '          то указывать полное имя к программе... н\п "C:\Program Files\7-Zip\7z.exe"
      MyProcess.StartInfo.UseShellExecute = False
        '          это праметр определяет оболочку которая необходима для запуска процесса
        '          это приблуда для кроссплатформенности - ЗАБЫЛИ тупо всегда назначаем "False"
        '          тобишь открываем Wind-ой
        MyProcess.StartInfo.RedirectStandardInput = True
        '          перенаправление потока ВВОД, и дискриптора 2 на стандартный поток реального времени
        MyProcess.StartInfo.RedirectStandardOutput = False
        '          перенаправление потока ВЫВОД нам ни в коем случае не нужно... так что назначаем "False"
        '          и не забываем что речь идет о процессе у него все зеркально пользователю... т.е. то что пользователю ВЫВОД
        '          то процессу ВВОД
        MyProcess.Start()
        '          запуск процесса.
        Console.ReadKey()
        '          остановка на получении NextKey в консоли... для того чтоб она не закрылась

Да это уже и не важно...


Время: 13:56.

Время: 13:56.
© OSzone.net 2001-