Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отобразить окно и сделать его активным 
:(
    Опции темы
artsb
Дата 19.12.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Всем привет!

Никак не могу сделать окно активным. Пробовал ShowWindow, BringWindowToTop, SetActiveWindow, SetWindowPos, Send(Post)Message. Всё одно - окно разворачивается но не становится активным, а остаётся под текущим окном. Уже не знаю что делать.
Все танцы с бубном происходят под Vista'ой.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 19.12.2009, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть ещё SetForegroundWindow. smile
PM   Вверх
artsb
Дата 20.12.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586, спс. Испробую.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 20.12.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Помогло! Спасибо 586.
Осталась единственная проблема, о которой я не упомянул сразу.
Если окно было в свёрнутом состоянии, то после того как оно развернётся, перестаёт работать кнопка свернуть. Она подсвечивается и нажимается, но толку от этого никакого (тоже самое с пунктом системного меню). Причем само приложение работает отлично и остальные системные кнопки тоже. Если нажать на кнопку приложения на панели задач, происходит анимация развёртывания окна (?!) и кнопка свернуть начинает работать нормально.
Что это за ерунда и как это можно вылечить?

ЗЫ окно разворачиваю так:
Код

ShowWindow(window, SW_SHOW);

Со всеми остальными флагами та же песня.

Это сообщение отредактировал(а) artsb - 20.12.2009, 14:04


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 20.12.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А если так:
Код
ShowWindow(Application->Handle, SW_RESTORE);


Можно ещё окно приложения восстановить классическим для VCL способом, но не знаю, как это будет работать в висте:
Код
Application->Restore();

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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586, так окно "не моё". Я его ищу через FindWindow.
Я, вообще, делаю так, чтобы при запуске второго экземпляра моей программы, открывалось окно первой, а не запускалась вторая копия. Так что, ту можно воспользоваться и сообщениями. Но если можно обойти предыдущий косяк, то нет смысла извращаться.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
THandle
Дата 20.12.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



artsb, хмм... как то странно... Я бы сделал так:

Окошком приложения обрабатываем некое наше сообщение. В нем один из параметров я бы задействовал под передачу строки. (LPARAM пусть будет).
Ну и в этом же сообщении разворачиваем свое окно.

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

Как то так наверное.
PM   Вверх
artsb
Дата 20.12.2009, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 22.12.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Использование сообщений не помогло...
Обработчик сообщения:
Код

TForm *frm;
// проверяю какое окно сейчас активно: дочернее или основное

// разворачиваю окно

SetForegroundWindow(frm->Handle);

Вместо строки "// разворачиваю окно" пробовал много чего, но помогло только:
Код

ShowWindow(frm->Handle, SW_SHOW);

И опять теже проблемы с кнопкой свернуть  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
THandle
Дата 22.12.2009, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



artsb, выложи тестовый пример поного твоего случая smile
PM   Вверх
artsb
Дата 22.12.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Вот тестовый проект. Абсолютно голый. Та же беда.

ЗЫ если проект открыт в билдере и окно запущенного приложения свёрнуто, то FindWindow находит окно из проекта smile Может показаться, что код не работает. Поэтому для тестирования я закрывал проект полностью.

ЗЗЫ Под Win7 та же беда. Мне кажется, версия билдера роли тут не играет это же WinAPI...


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  TestApplication.rar 17,10 Kb


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
shklowsky
Дата 23.12.2009, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

Репутация: 5
Всего: 6



PM MAIL   Вверх
artsb
Дата 23.12.2009, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



shklowsky, спасибо. Помогло.
Кстати, я тоже баловался с кнопкой приложения. Но нужно было юзать флаг SW_SHOWNORMAL, а я использовал SW_SHOW.
Код

 ShowWindow(Application->Handle, SW_SHOWNORMAL);
 ShowWindow(frm->Handle, SW_SHOW);
 SetForegroundWindow(frm->Handle);

В висте отлично работает, а вот в вин7 не хочет выдвигать окно вперёд, просто кнопка приложения мигает и всё. Но это мелочи.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 25.12.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Полазил на сайте MSDN и некоторых зарубежных сайтах и решил проблему!
Вся беда в том, что функция SetForegroundWindow и ей подобные корректно отрабатывают только из активного процесса. А у меня была ситуация, что я отправляю сообщение из активного приложения в неактивное и уже из него пытаюсь "выдвинуть" окно. И если в Висте это прокатывало, то Win7 здесь будет по строже smile
В общем, вот:
Код

SetLastError(0);
if(!CreateMutex(NULL, true, "CarInsurance"))
 return 1;
else if(GetLastError() == ERROR_ALREADY_EXISTS) {
 void *window;
 window = FindWindow("TMainForm", NULL);
 if(window && (window = GetWindow(window, GW_OWNER))) {
  ShowWindow(window, SW_SHOWNORMAL);
  SetForegroundWindow(window);
  return 1;
 }
}



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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