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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2013, 19:48   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Восклицание Получить гл. окно от дочернего.

Доброго времени суток!

Моя программа "встраивает" моё окно, в окно другой программы.
Банально перерисовывает его в нужных координатах и делает StayOnTop если окно активно.

Проблема:
Если я выбираю чужое окно(не элемент чужого окна), то все нормально. Моё окно переходит в FormStyle:=fsNormal.
А если я выбираю элемент в чужом окне, то этого не происходит.

В итоге глюк:
Программа куда я рисую своё окно - прячется, мой аддон - не прячется(fsStayOnTop) и перекрывает окно в котором юзер работает(выбрав в нем элемент( не само окно), и передав фокус).

Пробовал использовать и GetParent, и GetWindow с флагом GL_OWNER - не работает.


Код:
  hW := FindWindow('TChatClient', nil);
  if (hW <> 0) then
  begin
    hFor := GetForegroundWindow;
    if (hFor = hW) or (GetParent(hFor) = hW) or (GetWindow(hFor, GW_OWNER) = hW)
    then
      FormStyle := fsStayOnTop
    else
      FormStyle := fsNormal;
Суть в том, чтобы моё окно работало, когда пользователь работает с программой, к которой оно прицеплено(включая все дочерние окна от этой программы), во всех остальных случаях, моё окно прячется.

Последний раз редактировалось Человек_Борща; 15.07.2013 в 19:50.
Человек_Борща вне форума Ответить с цитированием
Старый 15.07.2013, 20:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Навскидку: Таймер (или доппоток), проверяющий активность твоего окна. Если неактивно (т.е. фокус не принадлежит ни одному из твоих контролов - прятаться.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2013, 21:44   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Stilet, не в этом суть.
Моё окно должно рисоваться когда активно окно(или дочерние окна), с которым связано мое, и моё окно становиться в FormStyle:=fsStayOnTop. В любом другом случае:
fsNormal.


Даже в случае с дочерними окнами, окна, к которому моё привязано я не могу отследить привязку, т.е. с таким кодом:
Код:
  hW := FindWindow('TfChatClient', nil);
  if (hW <> 0) then
  begin
    hFor := GetForegroundWindow;
    if (hFor = hW) or (GetParent(hFor) = hW) or (GetWindow(hFor, GW_OWNER) = hW) or
      (GetWindow(hFor, GW_HWNDFIRST) = hW) then
      FormStyle := fsStayOnTop
    else
      FormStyle := fsNormal;
При некоторых дочерних окнах моё окошко прячется.
А при таком раскладе все ок:
Код:
    RealGetWindowClass(hFor, @sName, Length(sName));
    if (hFor = hW) or (sName = 'TfSendMessages') or (sName = 'TfForum') or
      (sName = 'TfOptions') or (sName = 'TfChannels') or (sName = 'TfUsersStat') or
      (sName = 'TfChannelSettings') or (sName = 'TfIgnore') then
      FormStyle := fsStayOnTop
    else
      FormStyle := fsNormal;
Но не катит, окон много и есть динамические.

Последний раз редактировалось Человек_Борща; 15.07.2013 в 21:59.
Человек_Борща вне форума Ответить с цитированием
Старый 15.07.2013, 23:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ух... Если не секрет в чем смысл задачи?
А то я как-то не соображу четко что нужно то...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2013, 01:10   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
Ух... Если не секрет в чем смысл задачи?
А то я как-то не соображу четко что нужно то...
Есть программа чата. Разработчик чата не предусмотрел написания дополнений. Потому я написал отдельное приложение которое встраивается в этот чат и всегда на виду, когда чат активен.

Если юзер работает в окне чата и всех производных окнах этого же чата, то моё окно так же рисуется. Как только окно чата исчезает, моё так же на это реагирует.

Другое дело, когда окно чата не в фокусе и не скрыто.
Для этого использую GetForegroundWindow, и делаю сравнение, если текущее окно отличается от окна чата, то моё окно перестает перекрывать все окна.
Вот с эти и проблема.

Если переключаться на чужое окно(именно само окно а не какие-то кнопки и т.п. внутри), то:
Цитата:
if (hFor = hW) then
FormStyle := fsStayOnTop
else
FormStyle := fsNormal;
работает.

А если переключится в чужое окно, кликнув на кнопки и т.п. но не на само окно, то моя форма остаётся в fsStayOnTop, но окно того же чата уходит на задний план. И моё окошко мешает пользователю.

Этот же баг характерен и для окон самого чата.

Чем это лечить?
Человек_Борща вне форума Ответить с цитированием
Старый 16.07.2013, 07:58   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ага, терь еще ону айдею толкну: GetForegroundWindow() даст активное окно. Если это не главное окно чата, то в цикле можно посредством GetParent() получать родителей по иерархии, найдя главное окно чата, и определив его видимость и принадлежность активного окна этому чату.
Код:
  hW := FindWindow('TfChatClient', nil);
  if (hW <> 0) then
  begin
    hFor := GetForegroundWindow;
    b:=false;
    repeat
     hFor:=GetParent(hFor);
     b:=hFor=hW;
    until b; 

    if b then
      FormStyle := fsStayOnTop
    else
      FormStyle := fsNormal;
Надеюсь на сей раз я точно понял что нужно
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2013, 15:05   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Неа, не сработало, ПО виснет намертво.
Таймер стоит на 200 мс, чтобы четко реагировать на действия юзера ну и перекрывать скин чата.

Демонстрация глюка: http://youtu.be/Zk1qIyJs8Sg
Когда я, из окна чата, переключаюсь на чужое окно - то все нормально.
Когда я, из окна чата, переключаюсь в чужое окно(что-то внутри) - то происходит глюк.
Человек_Борща вне форума Ответить с цитированием
Старый 16.07.2013, 16:09   #8
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

А GetForegroundWindow что возвращает в такие моменты?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 16.07.2013, 17:00   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
b:=(hFor=hW) or (hFor=0);
    until b; 

    if b and IsWindowVisible(hFor)then
      FormStyle := fsStayOnTop
    else
      FormStyle := fsNormal;
не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2013, 17:24   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
не?
Так тоже не заработало. Моё окно перестало рисоваться вообще и не показывается вовсе.

Цитата:
А GetForegroundWindow что возвращает в такие моменты?
Окно в котором юзер работает.


Что странно, такой код:
Код:
    hFor := GetForegroundWindow;

    if (hFor = hW) or (GetParent(hFor) = hW) then
      FormStyle := fsStayOnTop
    else
      FormStyle := fsNormal;
Успешно должен работать хотя бы для самого окна чата, т.е. для гл. окна и всех дочерних моё окно будет видимым, в остальных случаях моё окно видимым не будет. Но и он не работает. Хотя тот же Spy++ показывает, что parentWindow = гл. окну чата.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить имя дочернего класса в базовом Cronos20 PHP 3 28.03.2011 19:44
[?] Послать клавишу в чужое окно, не выводя окно на передний план. Moriarty Win Api 4 21.02.2011 05:11
Получить имя активного дочернего окна в MDI JeyKip Общие вопросы C/C++ 4 05.12.2010 02:59
Получить дескриптор дочернего окна Crudelis Win Api 1 15.10.2010 21:45
«Окно+символ». Создать класс, представляющий окно в текстовом режиме. RustreX Паскаль, Turbo Pascal, PascalABC.NET 1 11.11.2007 19:28