Не сворачивается окно после показа через WinAPI?

 
0
 
Delphi, Kylix and Pascal
ava
Nicholas | 03.10.2016, 09:00
При старте приложения производиться поиск окна и если приложение уже запущено и свернуто, оно разворачивается и показывается вот таким кодом:

Begin
ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd);
end;


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

В чем может быть проблема???
Ответы (2)
ava
Peter | 04.10.2016, 10:25 #
Для иллюстрации проблемы и ее решения провел эксперимент. Приложение с двумя формами. На форме две пары кнопок. В первой группе выполняется «сворачивание» и «восстановление» второй формы средствами Delphi. Во второй – средствами WinAPI. Все просто. Для контроля состояния второго окна проверяю ее свойство Visible.
Имеем:
•    при использовании средств Delphi проблем нет. Окно сворачивается, и свойство Visible становится False. При восстановлении становится True. И при этом окно закрывается нажатием на кнопку заголовка формы «закрыть». Ничего особенного не заметил – все «штатно».
•    при использовании средств WinAPI, действительно, возникают проблемы. При восстановлении окна его свойство Visible остается False. Правда повторное сворачивание кнопкой из заголовка формы «свернуть» происходит и свойство Visible становится False. Восстановление окна приводит к его отображению, однако свойство Visible продолжает оставаться False. И закрыть окно нажатием на кнопку заголовка формы «закрыть» не получается.
    Ответ напрашивается сом собой. Без особых изысков это выглядит так: «отработав» функции WinAPI никак не меняют значения свойств формы приложения Delphi. Подобно сам наблюдал на заре программирования с системой DOS, когда переходил в графический режим средствами BIOSа, а работать пытался графическими средствами PASCAL. «Графическая подсистема» PASCAL просто «считала» что работа проходит в текстовом режиме и «сообщала об ошибках этапа исполнения. Наоборот (инициализация средствами PASCAL, а работы средствами BIOSа) все работало нормально.
    Как решить проблему? Здесь есть варианты. Например, работать едиными средствами. Это или только средствами Delphi, или только WinAPI. Можно находить "ссылка на окно" средствами WinAPI, а дальше применять «инструменты» Delphi. Но зачем это в данном случае, если есть, например, Form2.Show или Form2.ShowModal? Возможно, может возникнуть необходимость использовать нереализованные в «используемой» версии Delphi возможности операционной системы? Это, да. Но тогда, на мой взгляд, следует более внимательно контролировать свои действия и учитывать изменения «состояния» форм и менять, если есть такие, соответствующие свойства у формы Delphi приложения. В данном случае восстанавливаем форму средствами WinAPI, тогда и меняем соответствующие свойства это формы (Visible, а может быть нужно и ActiveControl у главной формы).
    Результаты «легкого» поиска (работа с окнами Delphi с использованием API) в сети:
http://web.znu.edu.ua/lab/studres/OGLbyDelphi/main1.htm - это «Работа с окнами в DELPHI с использованием API»
http://parsers.info/2009/04/rabotaem-s-okn...hi-api-chast-1/ - это «Работаем с окнами и объектами. Delphi. Api. Часть 1»
Разумеется - это не академическое и не всеобъемлющее исследование.
ava
Nicholas | 04.10.2016, 17:18 #
Piter, show  и showmodal не помогут т.к. работа идет с чужим приложением - первая копия программы.

Не нашел другого способа восстановить все флаги после развертывания окна процедурой ShowWindow, кроме как кинуть на форму ApplicationEvents и добавить вот такой код:


procedure TForm1.ApplicationEvents1Activate(Sender: TObject);
begin
Application.Restore;
end;



естественно приложение теперь видит что окно развернуто и спокойно дает свернуть его по кнопке...
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
  Nicholas   Peter
advanced
Отправить