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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка на запуск одного экземпляра программы, И TCoolTrayIcon 
:(
    Опции темы
Garmahis
Дата 18.4.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Задача проверки проста и избита, если эта программа уже запущена то развернуть запущенный экземпляр и передать ему фокус. Проблема же в том что программа минимизируется в системный трей. это делается с помощью компонета CoolTrayIcon. И вызывается она при клике на иконке командой CoolTrayIcon1.ShowMainForm; Как мне её запустить?
Вот код:
Код

program Redaktor;

{%File 'ModelSupport\Unit1\Unit1.txvpck'}
{%File 'ModelSupport\default.txvpck'}

uses
  Forms,
  Windows,
  Unit1 in 'Unit1.pas' {RedForm};

{$R *.res}

var
  hwnd: THandle;


begin
  hwnd := FindWindow('TRedForm', 'RedForm');
  if hwnd = 0 then
  begin
  Application.Initialize;
  Application.CreateForm(TRedForm, RedForm);
  Application.Run;
  end
  else
  SetForegroundWindow(hwnd);

end.
 


M
Girder
Поиск... http://forum.vingrad.ru/index.php?act=Search&f=2
 
PM   Вверх
Poseidon
Дата 18.4.2006, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



А зачем окно искать? Ищи процесс. И если он есть, посылай Windows message. А в своей программе отлавливай это сообщение и делай CoolTrayIcon1.ShowMainForm  smile    


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Sunvas
Дата 19.4.2006, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(Poseidon @  18.4.2006,  21:06 Найти цитируемый пост)
Ищи процесс.

И если их будет больше чем один (один - это тот, который мы запустити) то
Цитата(Poseidon @  18.4.2006,  21:06 Найти цитируемый пост)
посылай Windows message. А в своей программе отлавливай это сообщение и делай CoolTrayIcon1.ShowMainForm      

 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Marlin
Дата 19.4.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Sunvas - нет лучше сделать проверку в начале программы, если процес найден, тогда послать ему сообщение, а текущий процес закрыть , чем искать второй процес. 
--------------------
Программист решает проблемы, о которых пользователь даже не задумывается,способами, о котороых он даже не подозревает.
PM MAIL   Вверх
AKN
Дата 19.4.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Sunvas - нет лучше сделать проверку в начале программы, если процес найден, тогда послать ему сообщение, а текущий процес закрыть , чем искать второй процес.  


и ты найдешь текущий процесс, передашь ему сообщение и закроешь. Проще разрешить эту проблему через захват уникального идентификатора, чем искать процессы:


Код

var AtomText: array[0..31] of Char;  


procedure LookForPreviousInstance;  
var  
  PreviousInstanceWindow : hWnd;  
  AppName : array[0..30] of char;  
  FoundAtom : TAtom;  
begin  
  // помещаем имя приложения в AtomText  
  StrFmt(AtomText, 'OnlyOne%s', [Copy(Application.Title,1,20)]);  
  // Проверяем, не создано ли уже атома с таким именем приложения 
  FoundAtom := GlobalFindAtom(AtomText);  
  if FoundAtom <> 0 then      // эта копия приложения уже запущена 
  begin  
    StrFmt(AppName,'%s', [Application.Title]);  
    // изменяем текущий заголовок, чтобы FindWindow не видела его 
    Application.ShowMainForm := false;  
    Application.Title := 'destroy me';  
    // ищем предыдущую копию приложения 
    PreviousInstanceWindow := FindWindow(nil,AppName);  
    // Передаём фокус на предыдущую копию приложения 
    // завершаем текущую копию 
    Application.Terminate;  

    if PreviousInstanceWindow <> 0 then  
      if IsIconic(PreviousInstanceWindow) then  
           ShowWindow(PreviousInstanceWindow,SW_RESTORE)  
      else SetForegroundWindow(PreviousInstanceWindow);  
  end;  
  // создаём глобальный атом, чтобы предотвратить запуск другой копии приложения 
  FoundAtom := GlobalAddAtom(AtomText);  
end;  


constructor TForm.Create(AOwner: TComponent);  
begin  
  inherited;  

  LookForPreviousInstance;  
 
end;  


destructor TForm.Destroy;  
var  
  FoundAtom : TAtom;  
  ValueReturned : word;  
begin  
  // не забудьте удалить глобальный атом 
  FoundAtom := GlobalFindAtom(AtomText);  
  if FoundAtom <> 0 then ValueReturned := GlobalDeleteAtom(FoundAtom);  

  inherited Destroy;  
end; 


 
PM MAIL   Вверх
Romikgy
Дата 19.4.2006, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



AKN, на атомах делать проверку присутствия другого процесса того же приложения, не есть хорошо, 
т.к. если приложение зависнет, второе уже не запустишь smile
Делать надо или на мютексах или на чем то похожем

Добавлено @ 20:03 
http://forum.vingrad.ru/index.php?showtopi...%BC%D0%BC%D0%AB
Здесь смотри 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sunvas
Дата 20.4.2006, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Цитата(AKN @  19.4.2006,  11:53 Найти цитируемый пост)
 Проще разрешить эту проблему через захват уникального идентификатора, чем искать процессы:

Допустим я попросту киляну процесс диспетчером задач. Ты же более программу в этом сеансе не запустишь. 


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

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

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

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

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


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

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


 




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


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

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