Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/84: Рейтинг темы: голосов - 84, средняя оценка - 4.96
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497

Развернуть копию программы из трея

16.02.2012, 22:32. Показов 17382. Ответов 82
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно чтобы 2ая копию программы разворачивала 1уй копию программы.
Много читал по форумам но так и не нашёл ничего.
Мб что то пропустил если поподалось киньте пожалуйста ссылочку.
Я так понял что программа должна послать сообщение на разворачивание как то так.
средставами sw_show, normal и тд. и тп не получилось так как.при разворачивании проги компоненты не отображаются некоторые.

программа сворачивается через cooltrayicon через процедуру(если это важно)

Заранее спасибо.
2
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.02.2012, 22:32
Ответы с готовыми решениями:

Развернуть программу из трея
Таким образом сворачивается программа в трей- procedure TForm1.Button1Click(Sender: TObject); begin TrayIcon1.Visible := True; ...

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

Развернуть окно программы
В Свойствах окна (Properties/Aling) ставлю alClient. В окне стоит: 1. ToolBar его длина не увеличивается с изменение размеров окна 2....

82
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
17.02.2012, 04:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от deathNC Посмотреть сообщение
paxan86, я как-то раньше избавлялся от этого трабла. Вот найти бы, как я справлялся. Самому уже интересно Но у меня не только из-за ShowMainForm оно так было. Вообще при сворачивании всегда портачило... (когда на D7 писал)
Может быть это косяк D7?)
Ищи=)
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
17.02.2012, 04:48
У меня есть еще версия непроверенная, незнаю правильная или нет, что это из-за выравнивания компонентов на форме, и при востановлении формы у них координаты сбиваются каким то образом, у меня что то такое было когда-то я присваивал принудительно компонентам их расположение на форме Top и Left, другово более изощренного способа не нашел тогда.
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
17.02.2012, 04:56
Точно, я придурок
верни вот это:
Delphi
1
Application.ShowMainForm := False;
И вместо этого:
Delphi
1
ShowMessage(MainForm.Handle, SW_SHOW);
вызывай это:
Delphi
1
postMessage(Self.Handle, WM_SysCommand, SC_Restore, 1);
И подправь процедуру ControlWindow таким образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TMainForm.ControlWindow(var Msg: TMessage);
begin
  // если это сообщение - "свернуть форму" - перехватываем его
  If Msg.WParam = SC_MINIMIZE then
     begin
       Shell_NotifyIcon(nim_add, @_tray1); // добавляем в трей значок
       ShowWindow(Handle, sw_Hide); // скрываем форму
     end
  else if Msg.WParam = SC_RESTORE then // показать форму
    Self.Show
  else // иначе
    inherited; // не перехватываем сообщение
end;
Метод более извращенский, но он работает, потому что тут мы перехватываем SC_Restore, и вместо него вызываем MainForm.Show;
Не знаю почему, но MainForm.Show работает стабильнее, нежели ShowMessage(Handle, SW_Show);

Добавлено через 3 минуты
Правда это чревато последствиями, если ты в будущем будешь делать так, что прога может вместо трея сворачиваться традиционным образом (в панель задач). Но этого можно избежать, если ещё в процедуре ControlWindow сделаешь так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TMainForm.ControlWindow(var Msg: TMessage);
begin
  // если это сообщение - "свернуть форму" - перехватываем его
  If Msg.WParam = SC_MINIMIZE then
     begin
       Shell_NotifyIcon(nim_add, @_tray1); // добавляем в трей значок
       ShowWindow(Handle, sw_Hide); // скрываем форму
     end
  else if Msg.WParam = SC_RESTORE then // показать форму
    begin
      Self.Show;
      inherited; // ВОТ ЭТО ВСЁ ТАКИ ЛУЧШЕ ОСТАВИТЬ ТУТ
    end
  else // иначе
    inherited; // не перехватываем сообщение
end;
Добавлено через 2 минуты
Если выполнится код с inherited;, то сообщение дойдёт до формы, и выполнится соответствующее сообщению действие. мы как раз при сворачивании inherited не выполняем, поэтому сворачивание формально не происходит, а только скрывается форма.

Добавлено через 39 секунд
Цитата Сообщение от paxan86 Посмотреть сообщение
Может быть это косяк D7?)
не, у меня D2010 - всё равно был такой же глюк. Теперь всё нормально! :dance3:
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
17.02.2012, 07:58
Вот, доведённый до ума вариант. Долбаная среда делфи, не знаю, как её к API приучить
идиотизм :D
В общем, возникла проблема - из-за того, что мы юзали SC_Restore чтобы показать форму, это обернулось тем, что если форму свернёшь "развёрнутой на весь экран", а потом щёлкнешь по значку в трее - она восстанавливается уже не на весь экран, а в обычное состояние. Поэтому я подкорректировал код, добавив в LParam число - 123456. Это просто левое число, которое система вряд ли пошлёт форме через SC_Restore; Поэтому в функции ControlWindow будем ориентироваться по этому числу.
Дальше случился косяк, сам не знаю из-за чего. Запускаешь программу - первый раз форма разворачивается, и всё нормально. Второй раз - значок убирается, а форма не показывается. В результате исследований выявил, что в делфи оч хреново пашет функция SHowWindow. Пришлось заменить её методами формы Show и Hide (что по сути то же самое). Теперь вроде всё пашет.
Вложения
Тип файла: rar Tray.rar (9.1 Кб, 35 просмотров)
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
17.02.2012, 08:11
И когда открывается вторая копия, ты первой копии посылай именно такое сообщение:
Delphi
1
postMessage(FormOfFirstCopy.Handle, WM_SysCommand, SC_Restore, 123456);
Это получается как раз сообщение на разворачивание. Оно по идее SC_Restore должно восстанавливать форму из Minimized или Maximized режима. Но мы в процедуре ControlWindow перехватываем его, если в LParam стоит число 123456
1
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
17.02.2012, 18:14  [ТС]

почемуто
Delphi
1
Icon: TIcon;
[Error] Unit1.pas(242): Undeclared identifier: 'TIcon'
И ещё одна печаль (при запуске 2ой копии):

 Комментарий модератора 
Скриншот откорректирован!
Миниатюры
Развернуть копию программы из трея  
0
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
17.02.2012, 18:25  [ТС]
Разворачивание и сворачивание отлично работает=)
А косяк нашёл=)
Delphi
1
2
   H := FindWindow(nil,'AutoReboot v2.3F   ');
    postMessage(h, WM_SysCommand, SC_Restore, 123456);
Только 2 проблемы :
1).
Delphi
1
Icon: TIcon;
[Error] Unit1.pas(242): Undeclared identifier: 'TIcon'
2).
К сожалению не разворачивает 1ую копию...
0
 Аватар для Игорь[Igor]
726 / 478 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
17.02.2012, 20:58
Цитата Сообщение от paxan86 Посмотреть сообщение
Только 2 проблемы :
1).
Код Delphi1 Icon: TIcon;
[Error] Unit1.pas(242): Undeclared identifier: 'TIcon'
2).
К сожалению не разворачивает 1ую копию...
Если это так то возможно недобавлен модуль Graphics
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 00:39
Вместо класса TIcon можно обойтись и одной функцией, в принципе...
Delphi
1
2
3
4
5
private
  // объявление в форме (в проге оно уже как-то объявлено)
  icon1: HIcon;
... // а это на создание формы:
  icon1 := LoadIcon(hInstance, PAnsiChar(FileName));
Где FileName - этой путь к файлу иконки.
А сама функция объявлена в модуле Windows; И теперь всё, что было с TIcon можно стереть, и заменить этим.
На счёт открытия второй копии - я подумаю. Может, смозгую чего.
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 03:14
Вот, тут (прикреплён архив) я с File Mapping помудрил, вроде получилось сделать так, чтобы предыдущая копия разворачивалась.
Читать

В общем, в PagFile создаётся файл, и открывается для работы в адресном пространстве процессов. Вот из этого файла и читаем информацию - если она там имеется, то запущена программа уже не в первый раз. Иначе, мы туда записываем хэндл нашей формы, и не закрываем файл. А все последующие копии программы, обнаружив хэндл, будут посылать ему сообщение, а сами завершатся.
Сделано по-извращенски, но вроде работает.
А вдруг моя программа завершится аварийно, и хендл останется в PageFile, и когда я её снова попытаюсь запустить - копия будет завершаться, посчитав, что уже есть запущенная копия?
Я попробовал единственную запущенную копию удалить из процессов в диспетчере задач в надежде, что данные останутся в PageFile. Однако, они всё равно исчезли (или не знаю, что с ними произошло), во всяком случае когда закрывается последняя копия проги, эти данные становятся недоступными - то есть это гарантия, что если твоя прога вылетит с ошибкой, то ты её сможешь запустить без перезагрузки компьютера.
Хотя можно по этому поводу не париться - и проверить, существует окно с данным хэндлом. Если нет, то считать что ничего не загружено, и спокойно перезаписать данные в PageFile.

Кстати, File Mapping позволяет обмениваться данными между приложениями - весьма удобный способ. По этому поводу есть статейка в архиве, и к ней пример. Там в примере запускаешь несколько копий программки, печатаешь в поле текст, и смотришь, как в других копиях по таймеру из PageFile считывается и отображается инфа.

По поводу иконки какой-то глюк у меня, не стал заморачиваться - так что если у тебя не сработает LoadIcon, то верни TIcon
Вложения
Тип файла: rar Tray.rar (55.9 Кб, 87 просмотров)
1
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 03:16
Ах, да. Предыдущей копии посылается несколько другое сообщение с другим кодом. В примере всё увидишь
1
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
18.02.2012, 05:45  [ТС]
Спасибо!=)
В процессе изучения...

Добавлено через 2 минуты
Я так понял что по коду у тебя не должна 2ая копия запускаться однако почемуто запускается... или я что то не понял..?
Читаю дальше.
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 05:54
paxan86, то есть? Программа в прикреплённом архиве может запуститься дважды?
О_о

Добавлено через 22 секунды
Странно, у меня заработала. Сейчас ещё раз всё проверю.

Добавлено через 2 минуты
Там просто принцип такой - если программа при запуске обнаружила, что уже открыта первая копия, то она передаёт сообщение первой, а сама закрывается. Первая, получив сообщение, разворачивается, и показывает сообщение - мол нельзя запускать две копии.
1
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
18.02.2012, 05:57  [ТС]
Цитата Сообщение от deathNC Посмотреть сообщение
Там просто принцип такой - если программа при запуске обнаружила, что уже открыта первая копия, то она передаёт сообщение первой, а сама закрывается. Первая, получив сообщение, разворачивается, и показывает сообщение - мол нельзя запускать две копии.
Вообще такое не делается=)

Добавлено через 1 минуту
else if msg.LParam = 123457 then и ещё заметил что обрабатывается но не посылается..
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 06:00
paxan86, странно... то есть никаких сообщений, ничего?
А там есть ещё вложенный архив, FileMapping. Попробуй из него прогу скомпилить. Там наглядный пример, как работает FileMapping. Надо скомпилить и запустить несколько копий. В одной из них ввести что-нить и нажать ОК. В других появится эта надпись.

Добавлено через 1 минуту
Цитата Сообщение от paxan86 Посмотреть сообщение
else if msg.LParam = 123457 then и ещё заметил что обрабатывается но не посылается..
То есть обнаружение было, но не показывается первая копия? И не закрывается вторая?
1
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
18.02.2012, 06:00  [ТС]
D2009? спасибо щя в колледж приду напишу
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 06:09
paxan86, D2010
Но код должен работать и на D7.

Добавлено через 18 секунд
ой, прости. Там все PWideChar замени на PAnsiChar

Добавлено через 1 минуту
Я как всегда забыл, что по умолчанию в D7 - AnsiChar, а в D2010 - WideChar
Эта мода на двухбайтовую кодировку пошла где-то с D2007

Добавлено через 1 минуту
Не, проблема в другом. Там нет PWideChar.
Значит попробуй на D2009 компилить

Добавлено через 4 минуты
У меня и на D7 всё заработало О_о
Может, ты как-нить не так чего сделал?
Ты просто скачал архив и запустил, или чего изменял ещё?
1
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
18.02.2012, 16:15  [ТС]
Хм странно.. перекомпилил теперь всё работает) а пример с файлмаппинг там в д7 компонентов нету) надо в2009 надо попробовать запустить=) щя с треем в прогу вставлю затестю..=)
Я походу с утра что то с просони натыкал не то вот и не работала нормально прога
Извеняюсь....

Добавлено через 14 секунд
а ещё вопрос почему это всё описывается в private ?
Delphi
1
2
3
4
  _tray1: TNotifyIconData; // структура для иконки трея
  tray_icon: HIcon;
  hFileMapObj: THandle; //описатель FaleMapping
  lpBaseAddress: PChar; //"указатель" на начальный адрес данных
Добавлено через 7 минут
Всё заработало!! Ура!! D

Ты крут

Добавлено через 16 минут
Delphi
1
Icon: TIcon;
в чём различия
Delphi
1
Icon: HIcon;
и я не понял насчёт этого ты что то писал но я не понял(про замену)..)
0
 Аватар для deathNC
1905 / 1016 / 123
Регистрация: 08.12.2009
Сообщений: 2,792
Записей в блоге: 2
18.02.2012, 16:26
Цитата Сообщение от paxan86 Посмотреть сообщение
а ещё вопрос почему это всё описывается в private ?
просто. Вообще - разницы нет, хоть в public можно

Добавлено через 47 секунд
Цитата Сообщение от paxan86 Посмотреть сообщение
в чём различия
TIcon - это отдельный класс для работы с иконкой, а HIcon - это всего лишь идентификатор (число, как хэндл у формы)
1
51 / 46 / 8
Регистрация: 18.05.2011
Сообщений: 497
18.02.2012, 16:37  [ТС]
Всё работает на ура!
Миниатюры
Развернуть копию программы из трея  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2012, 16:37

Зависают torrent-программы, развернуть из трея не удается
Сначала мюторрент... Через некоторое время работы не отвечает... Развернуть из трея тоже не удается... Скачал BitTorrent - тоже самое... ...

Развернуть програму из трея
Короче свернул программу в трей при помощи Shell_NotifyIcon, немогу развернуть обратно, то что я передал в uCallbackMessage я так понимаю...

Развернуть приложение из трея
Добрый день, тема не новая, но ответа не нашел. Как через WinApi можно развернуть приложение из трея.? Процесс и дескриптор...

Не получается развернуть приложение из трея
Доброго времени суток форумчане. Подскажите по каким причинам может не работать команда Application.WindowState = xlNormal? Проблема...

Как развернуть форму из трея?
Всем привет:) Как программно развернуть программу из трея?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru