Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как обновить чужое приложение 
V
    Опции темы
MadCoder
  Дата 15.7.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Добрый вечер!

Подскажите пожалуйста, как можно обновить (Application.ProcessMessages) чужое приложение? smile 
PM WWW ICQ   Вверх
kami
Дата 15.7.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(MadCoder @  15.7.2009,  20:40 Найти цитируемый пост)
Подскажите пожалуйста, как можно обновить (Application.ProcessMessages) чужое приложение?

Обновить (перерисовать) и заставить обработать сообщения, ожидающие в очереди - это весьма разные вещи.
Что конкретно нужно?
Потом - что значит "обновить чужое приложение"?
Вот, например, explorer. ( не IE ! ) - у меня сейчас открыто 5 его окон ("обновляемых" независимо друг от друга), а процесс (приложение) запущен только один - explorer.exe. Какое конкретно окно из этих пяти нужно обновить?
Это в Delphi все проще - все визуальные компоненты работают (должны работать) в одном потоке (mainThread). Опять-таки пример с explorer показывает, что это совсем не обязательно.

Лучше опиши конкретную задачу.
PM MAIL WWW   Вверх
MadCoder
Дата 15.7.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(kami @ 15.7.2009,  21:20)
Цитата(MadCoder @  15.7.2009,  20:40 Найти цитируемый пост)
Подскажите пожалуйста, как можно обновить (Application.ProcessMessages) чужое приложение?

Обновить (перерисовать) и заставить обработать сообщения, ожидающие в очереди - это весьма разные вещи.
Что конкретно нужно?
Потом - что значит "обновить чужое приложение"?
Вот, например, explorer. ( не IE ! ) - у меня сейчас открыто 5 его окон ("обновляемых" независимо друг от друга), а процесс (приложение) запущен только один - explorer.exe. Какое конкретно окно из этих пяти нужно обновить?
Это в Delphi все проще - все визуальные компоненты работают (должны работать) в одном потоке (mainThread). Опять-таки пример с explorer показывает, что это совсем не обязательно.

Лучше опиши конкретную задачу.

Я имел ввиду произвести Application.ProcessMessages над главной формой чужого приложения.
PM WWW ICQ   Вверх
kami
Дата 15.7.2009, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(MadCoder @  15.7.2009,  22:16 Найти цитируемый пост)
 произвести Application.ProcessMessages над главной формой чужого приложения

Я привел пример чужого приложения - explorer.exe с открытыми 5-ю окнами.
Поясни, что считать в нем "главной формой"?
Еще раз - понятие "главная форма" применимо в основном только к Delphi приложениям.
PM MAIL WWW   Вверх
MadCoder
Дата 15.7.2009, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



К примеру есть приложение, которое коннектится к базе данных. Если БД не отвечает, главная форма висит и не перерисовывается. Как заставить ее перерисоваться из моего приложения?
PM WWW ICQ   Вверх
kami
Дата 15.7.2009, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Просто пытаюсь объяснить, что в общем случае задача не решаема - в Delphi все окна работают в одном потоке (mainThread) и метод Application.ProcessMessages благополучно обрабатывает это хозяйство, т.к. все сообщения приходят в очередь одного потока (и в этом методе "выбираются" оттуда). (примечание - это относится к визуальным компонентам, никто не мешает создать дополнительный поток и организовать в нем свою очередь сообщений, но во всех мануалах пишется, что обращаться из доп.потока к визуальным компонентам - чревато боком).
В "чужом" приложении каждое окно может быть в отдельном потоке. И принудительная выборка сообщений из одного потока никак не повлияет на другие окна. НЕТ такого понятия, как "главное окно".

Добавлено через 1 минуту и 10 секунд
Цитата(MadCoder @  15.7.2009,  22:40 Найти цитируемый пост)
 Как заставить ее перерисоваться из моего приложения?

Вот наконец-то мы пришли к конкретике.
Что за приложение "коннектящееся к базе данных", на чем написано?
PM MAIL WWW   Вверх
MadCoder
Дата 15.7.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(kami @ 15.7.2009,  22:41)
Добавлено @ 22:42
Цитата(MadCoder @  15.7.2009,  22:40 Найти цитируемый пост)
 Как заставить ее перерисоваться из моего приложения?

Вот наконец-то мы пришли к конкретике.
Что за приложение "коннектящееся к базе данных", на чем написано?

Неизвестно, БД приведена для примера smile. Это может быть любое приложение.

Вот, к пример Application.ProcessMessages:
Код

function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
  Handled: Boolean;
  Unicode: Boolean;
  MsgExists: Boolean;
begin
  Result := False;

  MsgExists := PeekMessage(Msg, 0, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE);

  if MsgExists or PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
  begin
    Unicode := (Msg.hwnd = 0) or IsWindowUnicode(Msg.hwnd);

    if not MsgExists then
    begin
      if Unicode then
        MsgExists := PeekMessageW(Msg, 0, 0, 0, PM_REMOVE)
      else
        MsgExists := PeekMessageA(Msg, 0, 0, 0, PM_REMOVE);
    end;

    if MsgExists then
    begin
      Result := True;
      if Msg.Message <> WM_QUIT then
      begin
        Handled := False;
        if Assigned(FOnMessage) then FOnMessage(Msg, Handled);
        if not IsPreProcessMessage(Msg) and not IsHintMsg(Msg) and
          not Handled and not IsMDIMsg(Msg) and
          not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
        begin
          TranslateMessage(Msg);
          if Unicode then
            DispatchMessageW(Msg)
          else
            DispatchMessageA(Msg);
        end;
      end
      else
      begin
  {$IF DEFINED(CLR)}
        if Assigned(FOnShutDown) then FOnShutDown(self);
        DoneApplication;
  {$IFEND}
        FTerminate := True;
      end;
    end;
  end;
end;
procedure TApplication.ProcessMessages;
var
  Msg: TMsg;
begin
  while ProcessMessage(Msg) do {loop};
end;

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

Есть ли возможность сделать подобное с чужим приложением?
PM WWW ICQ   Вверх
Romikgy
Дата 15.7.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



скорее всего нет , ибо если обработка одного сообщения зависла, основной цикл будет ожидать окончания обработки

Добавлено через 1 минуту и 11 секунд
Цитата(MadCoder @  15.7.2009,  21:40 Найти цитируемый пост)
Если БД не отвечает, главная форма висит и не перерисовывается. Как заставить ее перерисоваться из моего приложения? 

а зачем его перерисовывать , если данных нету?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
MadCoder
Дата 15.7.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(Romikgy @ 15.7.2009,  23:17)
а зачем его перерисовывать , если данных нету?

Чтобы пользователь его не убил, посчитав, что оно не работает.
PM WWW ICQ   Вверх
kami
Дата 15.7.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 15
Всего: 72



Цитата(MadCoder @  15.7.2009,  22:50 Найти цитируемый пост)
Вот, к пример Application.ProcessMessages:

какой-то знакомый код  smile  Я так понимаю, D2009?


Цитата(MadCoder @  15.7.2009,  22:50 Найти цитируемый пост)
Есть ли возможность сделать подобное с чужим приложением?

Да пойми же ты, подобное даже со своим сделать не всегда возможно, к примеру, если поток "застрял" в критической секции или в WaitFor с флагом Infinite...А если "приложение зависло" - то скорее всего, там и сидит. если не возникло исключительных ситуаций, которое это "чужое приложение" подавило, дабы не пугать юзера.

Сейчас посмотрел у себя в "закромах" - влезть в чужой процесс можно, но (из арсенала, который имеется у меня) - создав "свой" поток в нем. А вот как из этого "своего" потока влезть в "чужие"...
PM MAIL WWW   Вверх
Romikgy
Дата 15.7.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



Цитата(MadCoder @  15.7.2009,  22:23 Найти цитируемый пост)
Чтобы пользователь его не убил, посчитав, что оно не работает. 

проще будет имхо спрятать этот процесс от пользователя,
но при надобности оставить доступ к нему в своем софте


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
dvamaster
Дата 16.7.2009, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 2
Всего: 10



Цитата(MadCoder @  15.7.2009,  23:40 Найти цитируемый пост)
Подскажите пожалуйста, как можно обновить (Application.ProcessMessages) чужое приложение?


Повторюсь более детально

Окно не перерисовывается из-за того, что процедура обработки сообщений окна висит (поток соотвественно тоже), так как процедура висит, то она не обработает любые сообщения находящиеся в очереди, т.е. любые мессаги посылаемые в окно не пройдут.

Если перехватить процедуру обработки и запустить ее в другом потоке (это уже не безопасно, нет гарантии целосности синхронизации ), то этот новосозданный поток так же не сможет обработать сообщения. Сообщения поступают конкретному окну и потоку (), во всяком случае на NT платформах (win NT, 2k, xp и т.д., про другие не знаю).

Мое заключение... Нет возможности

Это сообщение отредактировал(а) dvamaster - 16.7.2009, 07:57


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
MadCoder
Дата 17.7.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Жаль! В любом случае всем спасибо за помощь, я узнал много нового smile .
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.