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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не сворачивается окно после показа через WinAPI? 
:(
    Опции темы
Nicholas
  Дата 3.10.2016, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



При старте приложения производиться поиск окна и если приложение уже запущено и свернуто, оно разворачивается и показывается вот таким кодом:
Код

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


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

В чем может быть проблема???
PM MAIL ICQ   Вверх
Piter
Дата 4.10.2016, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для иллюстрации проблемы и ее решения провел эксперимент. Приложение с двумя формами. На форме две пары кнопок. В первой группе выполняется «сворачивание» и «восстановление» второй формы средствами 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»
Разумеется - это не академическое и не всеобъемлющее исследование.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Piter
Дата 4.10.2016, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для иллюстрации проблемы и ее решения провел эксперимент. Приложение с двумя формами. На форме две пары кнопок. В первой группе выполняется «сворачивание» и «восстановление» второй формы средствами 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»
Разумеется - это не академическое и не всеобъемлющее исследование.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Piter
Дата 4.10.2016, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для иллюстрации проблемы и ее решения провел эксперимент. Приложение с двумя формами. На форме две пары кнопок. В первой группе выполняется «сворачивание» и «восстановление» второй формы средствами 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»
Разумеется - это не академическое и не всеобъемлющее исследование.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Piter
Дата 4.10.2016, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для иллюстрации проблемы и ее решения провел эксперимент. Приложение с двумя формами. На форме две пары кнопок. В первой группе выполняется «сворачивание» и «восстановление» второй формы средствами 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»
Разумеется - это не академическое и не всеобъемлющее исследование.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Piter
Дата 4.10.2016, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Для иллюстрации проблемы и ее решения провел эксперимент. Приложение с двумя формами. На форме две пары кнопок. В первой группе выполняется «сворачивание» и «восстановление» второй формы средствами 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»
Разумеется - это не академическое и не всеобъемлющее исследование.


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Nicholas
  Дата 4.10.2016, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



Piter, show  и showmodal не помогут т.к. работа идет с чужим приложением - первая копия программы.

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

Код

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



естественно приложение теперь видит что окно развернуто и спокойно дает свернуть его по кнопке...

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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