Ну чего, теоретики, практическая задача для вас.... :)

Все, что вы хотели знать о программизме, но боялись спросить.
Ответить
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Ну чего, теоретики, практическая задача для вас.... :)

Сообщение папа Карло »

Короче расклад такой... Моя программа запускает другую через автомейшен. У той программы которую я запускаю есть окошечки мессаджбоксы итд.... но нет одной фичи.... запустить ее в бакграунде... например у МС Ворда есть опция показать его или скрыть, а вот у этой программы нет. А скрыть надо, кровь из носа. :)

Не дайте погибнуть. :) Да, это все на C#... если это играет рояль.....

Большое мерси. :)
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Re: Ну чего, теоретики, практическая задача для вас.... :)

Сообщение Woozy »

Вариант 1. Получить хэндл окна той программы, когда уже стартанул. Возможно? Если да, то дальше.
Вызов API ShowWindow с параметрами хэндл окна и SW_HIDE.
=========================
Если "невозможно" получить хэндл окна. Запусти ту программу. Запусти Spy++ из Visual Studio. Определи "класс окна" (class name) и имя окна (window name). См вызов API FindWindow, возвращает хэндл окна. Теперь можешь приписать этот код и переходи к пункту "Если да, то дальше".

Вариант 2. Как именно программа запускается через automation? Как-нить пропихнуть hidden window можно? Или ещё лучше - без окна можно запустить? Тут много вариантов, как запускается, от реализации зависит.
Аватара пользователя
папа Карло
Шарманщик
Сообщения: 8565
Зарегистрирован: 17 фев 2003, 15:04
Откуда: НН -> BC -> WA -> UT -> CA

Сообщение папа Карло »

выглядит это примерно так:

Код: Выделить всё

using System;

namespace Namespace1
{
  class Class1
  {
    static void Main(string[] args)
    {
      3rdPartyCOMComponent cc = new 3rdPartyCOMComponent(); // вот тут получаем окно
      cc = null; // вот эта строчка его закрывает....
    }
  }
}
у компонента нет никаких методов для влияния над интерфейсом, ни хандлер не отдают, ничего. :(
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

Ну если это действительно так детерминировано, то от чего же не попробовать. Вот бывает когда окно создаётся совершенно не синхронно созданию COM объекта (никак другой процесс или поток), тогда всё сложнее.
папа Карло писал(а):выглядит это примерно так:

Код: Выделить всё

using System;

namespace Namespace1
{
  class Class1
  {
    static void Main(string[] args)
    {
      3rdPartyCOMComponent cc = new 3rdPartyCOMComponent(); // вот тут получаем окно

      HWINDOW hwnd = FindWindow(
             "ClassNameIFound",
             "WindowNameIFound"
              );

      ShowWindow( hwnd, SW_HIDE );
      // проверь параметры и перепиши в синтаксе C#, а то я писал "by heart"

      //cc = null; // вот эта строчка его закрывает....
    }
  }
}
у компонента нет никаких методов для влияния над интерфейсом, ни хандлер не отдают, ничего. :(
BTW, а управление сразу на следующую комманду после создания объекта переходит? Так, на всякий случай.
Ответить