Вопрос Отловить прогресс установки инсталятора inno setup в Visual C# NET 4.0

Alexandr_57

Новичок
Собственно вопрос. Есть ли в c# возможность отловить прогресс установки?
Если да то может мне ктонить выслать код или пример как это сделать?
 

Krinkels

Он где то тут
Администратор
А немного поподробнее. Весь процесс, начиная с приветствия и кончая финишной страницы, или же только значение прогрессбара?
 

Krinkels

Он где то тут
Администратор
Я шарпа не знаю, могу рассказать на примере плюсов( за основу взял установку inno ultra ):
Нажать на кнопку "далее"
C++:
int main( void )
{
    // Ищем наш инсталл
    HWND mWnd = FindWindow( L"TWizardForm", L"Установка — Inno Setup Ultra" );
    if( !mWnd )
        return 0;

    // Ищем кнопку
    HWND Button = FindWindowEx( mWnd, 0, L"TNewButton", L"&Далее >" );
    if( !Button )
        return 0;

    // Нажимаем
    SendMessage( Button, WM_LBUTTONDOWN, 0, 0 );
    SendMessage( Button, WM_LBUTTONUP, 0, 0 );

    return 0;
}
Конкретно по прогрессбару, в FindWindowEx имя класса будет "TNewProgressBar". Чтоб получить его позицию, нужно вызвать SendMessage с сообщением "PBM_GETPOS". По остальным сообщениям смотри тут.
 

Alexandr_57

Новичок
Я чет не понял. А нужно ли указывать имя процесса инсталятора?
И вообще както не ясно. Пример с нажатием кнопки. Или получается сам SendMesage вернет позицию
И где мне лучше всего делать отлов? В таймере.
 

Krinkels

Он где то тут
Администратор
Я чет не понял. А нужно ли указывать имя процесса инсталятора?
Ну, ищи инсталл другим способом, все в твоих руках

Или получается сам SendMesage вернет позицию
Тут же все написано, SendMesage вернет текущую позицию прогрессбара

А почему нет?
 

Alexandr_57

Новичок
Еще вопрос встречный. Как ортловить нажатие кнопки Установить и скрыть программу пока не завершиться процесс установки
Правдо не понял что именно указывать вот здесь: "Установка — Inno Setup Ultra"
И так. HWND и FindWindow в C# почемуто нету. Главное что в msdn по FindWindow только c++ а c# не указано хотя по идеи должен быть. Ведь это WinApi
 
Последнее редактирование:

zettend

Старожил
Если ты хочешь написать оболочку с помощью Visual Studio, а прикрутить распаковку(я как понял ISDone), скинь потом исходники проекта. Пожалуйста.
 

Alexandr_57

Новичок
Если ты хочешь написать оболочку с помощью Visual Studio, а прикрутить распаковку(я как понял ISDone), скинь потом исходники проекта. Пожалуйста.
Раз я не могу создать красивый стиль для инсталятора как это сделал для лунчера то собираюсь сделать отлов распаковки файлов и прикрутить к лунчеру c#
2016-10-03 (5).png
Собственно пока сделал так
C++:
public static class WinAPI
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    }

IntPtr mWnd = WinAPI.FindWindow("TWizardForm", "Установка — Inno Setup Ultra");
 

Alexandr_57

Новичок
Это название инсталла
Я понял. Какой код у PBM_GETPOS так как в c# его тоже нет. Да и мне чет подсказывает что вылезет куча ошибок
C++:
public static class WinAPI
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    }
 

Alexandr_57

Новичок
Короче на Visual Studio при запуске никаких проблем
А вот на виртуальной машине Windows 7 где нет студии:
7.png
Код:
C++:
public static class WinAPI
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    } 
private void tmr2_Tick(object sender, EventArgs e)
        {
            int v1 = 0x0400;
            int v2 = v1 + 8;
            IntPtr mWnd = WinAPI.FindWindow("TWizardForm", "Установка — " + SNameMakers[indexSelMaker]);
            IntPtr PrgBar = WinAPI.FindWindowEx(mWnd, (IntPtr)0, "TNewProgressBar", "");
            metroProgressBar1.Value = WinAPI.SendMessage(PrgBar, v2, (IntPtr)0, (IntPtr)0);
        }
 

Alexandr_57

Новичок
Проблему решил. Ошибок не возникает но код не работает. Не отлавливает значения progressbar
 

Krinkels

Он где то тут
Администратор
Такс, у тебя инсталл простой, или все страницы переделаны?
 

Alexandr_57

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

Krinkels

Он где то тут
Администратор
Я понял тебя.
Окно находишь, уже хорошо. Далее на нем ищи: TNewNotebook
C++:
HWND Notebook = FindWindowEx( mWnd, 0, L"TNewNotebook", L"" );
if( !Notebook )
    return 0;
А уж потом на этом Notebook ищи прогресс бар:
C++:
HWND PB = FindWindowEx( Notebook, 0, L"TNewProgressBar", L"" );
if( !PB )
    return 0;
 

Alexandr_57

Новичок
У меня вопрос. А ProgressBar его можно получить кагда он не виден пользователю?
Так. Вот окно и Notebook нашел а ProgressBar не может найти
 
Последнее редактирование:
Сверху