Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2018, 21:36   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Развернуть свою копию из трея или панели задач

Здравствуйте.
Моя программа при запуске сворачивается в трей. Нужно, чтобы при попытке запуска второй копии exe копия не запускалась, а разворачивалась из трея или если она свернута на панель задач, то оттуда.
Пробую так (в файле dpr):
Код:
var
    k : Cardinal;
    wnd : HWND;
begin
  CreateMutex(nil,false,'C14FBDB5-FBD7-4EB0-870B-98CB7A3420BE');
  k := GetLastError();
  if (k=ERROR_ALREADY_EXISTS)or(k=ERROR_ACCESS_DENIED) then
    begin
      wnd := FindWindow('TFmMain',nil);
      if wnd <> 0 then  //Условие выполняется      
        SendMessage(wnd,WM_GOTOFOREGROUND,0,0);//Это не срабатывает
        Application.Terminate;
        Exit;
    end;
  ...
  //Дальнейший запуск приложения в нормальном режиме
end
но SendMessage почему-то не разворачивает окно. Подскажите, где я ошибся. Спасибо.
tarakan1983 вне форума Ответить с цитированием
Старый 26.12.2018, 22:14   #2
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

я так делал: добавить в событие OnReceiveCmdLine компонента OneInstancesEx
beegl вне форума Ответить с цитированием
Старый 26.12.2018, 22:41   #3
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Попробуйте использовать функцию
Код:
ShowWindow(wnd, SW_SHOWNORMAL);
вместо
Код:
SendMessage(wnd,WM_GOTOFOREGROUND,0,0);//Это не срабатывает
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 26.12.2018, 22:52   #4
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Terran Посмотреть сообщение
Попробуйте использовать функцию
Код:
ShowWindow(wnd, SW_SHOWNORMAL);
вместо
Код:
SendMessage(wnd,WM_GOTOFOREGROUND,0,0);//Это не срабатывает
Пробовал, не работает
Цитата:
я так делал: добавить в событие OnReceiveCmdLine компонента OneInstancesEx
Спасибо, разбираюсь
tarakan1983 вне форума Ответить с цитированием
Старый 26.12.2018, 23:00   #5
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
Пробовал, не работает
Возвращает ли функция FindWindow дескриптор окна? В вашем варианте должен быть зарегистрирован класс TFmMain. Если вы пытаетесь осуществить поиск по заголовку окна, то поменяйте параметры местами.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 26.12.2018, 23:04   #6
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Terran Посмотреть сообщение
Возвращает ли функция FindWindow дескриптор окна? В вашем варианте должен быть зарегистрирован класс TFmMain. Если вы пытаетесь осуществить поиск по заголовку окна, то поменяйте параметры местами.
Спасибо.
Цитата:
Пробовал, не работает
Ошибся, все срабатывает, но не хватало одной команды
Получилось так
Код:
CreateMutex(nil,false,'C14FBDB5-FBD7-4EB0-870B-98CB7A3420BE');
  k := GetLastError();
  if (k=ERROR_ALREADY_EXISTS)or(k=ERROR_ACCESS_DENIED) then
    begin
      wnd := FindWindow('TFmMain',nil);
      if wnd<>0 then        
        ShowWindow(wnd, SW_RESTORE);
        SetForegroundWindow(wnd);
        //SendMessage(wnd,WM_GOTOFOREGROUND,0,0);
        Application.Terminate;
        Exit;
    end;
tarakan1983 вне форума Ответить с цитированием
Старый 26.12.2018, 23:09   #7
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Отлично
P.S. Вижу поменяли флаг вызова на необходимый.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 27.12.2018, 00:40   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А если не найдет окна? Мало-ли, еще не успело создаться. Да и имя класса окна достаточно примитивное, у другой программы может быть вполне
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 27.12.2018, 06:16   #9
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Откуда вы взяли C14FBDB5-FBD7-4EB0-870B-98CB7A3420BE?
Shouldercannon вне форума Ответить с цитированием
Старый 27.12.2018, 08:17   #10
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А если не найдет окна? Мало-ли, еще не успело создаться. Да и имя класса окна достаточно примитивное, у другой программы может быть вполне
Согласен, есть предложения?
Цитата:
Откуда вы взяли C14FBDB5-FBD7-4EB0-870B-98CB7A3420BE?
Это GUID, в компиляторе нажал ctrl + shift + g
tarakan1983 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi XE10 убрать свою программу с панели задач BLACK_RAIN Общие вопросы Delphi 8 21.05.2016 15:58
Группирование в панели задач Endifier Общие вопросы Delphi 27 20.06.2014 16:48
Значок на Панели задач volod3000 Общие вопросы Delphi 10 16.05.2011 20:13
Отображение в панели задач. Alex Cones Общие вопросы Delphi 1 24.01.2011 14:45