Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 03:19   #1
pr0n1x
Новичок
Джуниор
 
Регистрация: 19.05.2011
Сообщений: 1
По умолчанию Запуск программы в скрытом режиме.

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

Для того, чтобы скрыть программу запускал ее через CreateProcess c флагом SW_HIDE, да само основное окно программы не отображается, а вот окно приветствия, там где идет загрузка ресурсов скрыть не получается, оно всегда отображается на экране (в панели задач, оно не появляется.)

Программа которую, мне нужно запустить скорее всего написала на MFC, так как в папке программы находятся соответствующие библиотеки, в MFC есть специальный класс, так называемый Splash Screen, которые отвечает за создания таких окон приветствия. Но все же этот класс наследует основной класс окна, по этому я решил выполнить задачу следующим образом, запустить процесс, получить список всех окон которые создал мой процесс и сделать их невидимыми, вот код на C#
Код:
using System;
//using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;

namespace MNF_Controller
{
    public class MNF_Controller
    {
        public delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);        

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(uint dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);

        [STAThread]
        static void Main(string[] args)
        {
            Process proc = new Process();

            try
            {
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.FileName = "C:\\Program Files\\Micro Niche Finder 5.0\\MicroNicheFinder.exe";
                //proc.StartInfo.FileName = "C:\\Windows\\notepad.exe";
                proc.StartInfo.CreateNoWindow = false;
                proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                proc.Start();
            }
            catch (Exception e) {}

            while (proc.MainWindowHandle == IntPtr.Zero)
            {
                Thread.Sleep(500);
                proc.Refresh();
            }

            if (proc.MainWindowHandle == IntPtr.Zero)
            {
                foreach (ProcessThread pt in proc.Threads)
                {
                    EnumThreadWindows((uint)pt.Id, new EnumThreadDelegate(MNF_Controller.EnumThreadCallback), IntPtr.Zero);
                }
            }
            else
            {
                if (proc.CloseMainWindow())
                {
                    proc.Close();
                }
            }                   
        }

        static bool EnumThreadCallback(IntPtr hWnd, IntPtr lParam)
        {
            ShowWindow(hWnd, 0);
            return true;
        }
    }
}
когда вместо нужной программы, я запускаю процесс notepad.exe то код отрабатывает нормально, блокнот после создания сразу скрывается, он даже не отображается на экране, но в диспетчере задач присутствует, а вот когда я запускаю нужную программу, то код не срабатывает.

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

Это происходит скорее всего потому, что сам код которых получает список всех окон текущего процесса, срабатывает еще до того, как создаются эти окна. Можно решить эту задачу с помощью Thread.Sleep(1000) но это не правильное решение, так как мне нужно, чтобы окна на экран вообще не показывались, а в этом случае на некоторое время окно может показаться на экране.

Так вот кто знает, как правильно сделать? Или может кто знает, как запустить по другому программу в скрытом режиме. Спасибо.



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 19.05.2011 в 09:04.
pr0n1x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с книгой в скрытом режиме voam Microsoft Office Excel 9 14.10.2022 15:32
Запуск в режиме администратора Mc_1 Visual C++ 2 31.03.2011 15:13
Запуск в безопасном режиме? bymyny Общие вопросы Delphi 12 29.12.2010 16:15
Запуск BC 3.1 в полно экранном режиме Nitrino Общие вопросы C/C++ 2 17.11.2009 19:37
Нужно через exe'шник вызвать команду командной строке, в скрытом режиме killerloop Помощь студентам 11 09.07.2009 14:58