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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно активизировать окно 
:(
    Опции темы
Delphist
Дата 16.10.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Мое приложение должно работать в одном экземпляре для этого я используя:
Код

function
  CheckAppRun:
  integer;
var
  Map: THandle;  
begin
  Map := CreateFileMapping($FFFFFFFF, nil, PAGE_READONLY, 0, 32,
    '%af_src_comm_0');
  if Map = 0 then
    Result := -1
  else if GetLastError = ERROR_ALREADY_EXISTS then
    Result := 1
  else
    Result := 0
end;

function
  ActivatePreviousInstance(WndClass: PChar): boolean;
var
  Wnd: HWND;
begin

  Result := false;
  if (CheckAppRun = 1) then
  begin
    if (WndClass <> nil) then
    begin
      {если окно программы указано сделать его активным в системе}
      Wnd := FindWindow(WndClass, nil);
      if (Wnd <> 0) then
      begin
        {Хочу отобразить мое приложение, но оно не отображается}
        SwitchToThisWindow(Wnd, True);
      end;
    end
    else
      MessageBox(0, 'Приложение уже запущено!', 'Сообщение',
        MB_ICONINFORMATION or MB_OK);
    Result := true;
  end;
end;

if ActivatePreviousInstance('TMainForm') then Halt(1);

Для отображения своего приложения я использовал SwitchToThisWindow(Wnd, True), но оно не отображается. Я использовал ShowWindow(Wnd, SW_SHOWMAXIMIZED) окно отображается, но после такой операции его нельзя свернуть. 
Так как же правильно отобразить свое приложение не зависимо от того минимизировано оно или нет?


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
drkot
Дата 16.10.2006, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

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



Находиш указатель на класс главного окна формы, и манипулируеш.

Цитата(Delphist @  16.10.2006,  10:42 Найти цитируемый пост)
использовал ShowWindow(Wnd, SW_SHOWMAXIMIZED) 

У этой функции есть и другие параметры отображения.


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Delphist
Дата 16.10.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(drkot @  16.10.2006,  13:03 Найти цитируемый пост)
У этой функции есть и другие параметры отображения. 

Я все пробовал не помагает


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akella
Дата 16.10.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Цитата(Delphist @  16.10.2006,  10:42 Найти цитируемый пост)
Мое приложение должно работать в одном экземпляре для этого я используя:

не раз уже обсуждалось:
вот есть другой пример



Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  uOnly_One.pas 0,87 Kb
PM MAIL   Вверх
_hunter
Дата 16.10.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



по-идее нужно не TMainForm а TApplication показывать


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Akella
Дата 16.10.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



редактируем файл *.dpr (меню Project->view Source)

Код

uses
...

 uOnly_One in 'uOnly_One.pas',

{$R *.RES}

const
  UniqueString = 'SuperMarketMutex';
    {Может быть любое слово. Желательно латинскими буквами.}

begin
 //проверка запуска программы
 //если запущена, то выводим на передний план
 if not init_mutex(UniqueString) then
 begin
   hw := findWindow('TApplication','Супермаркет'); //Супермаркет (см. меню Project->Options---->Application->Title)
   if hw <> 0 then
   begin
     setForeGroundWindow(hw);
     ShowWindow(hw,SW_SHOWNORMAL);
    end;
   exit; {Выходим до инициализации, если мьютекс уже есть}
 end;

  Application.Initialize;
  Application.Title := 'Супермаркет';
  Application.HelpFile := 'sm.chm';
  Application.CreateForm(TDM, DM);
...




Добавлено @ 16:00 
Особенности:
1. даже при "гибели" приложения все, относящиеся к нему мьютексы удаляются с большой степенью вероятности.
2. Желательно "отметить" приложение в системе так, как указано в примере. При таком подходе Ваше приложение почти со стапроцентной вероятностью не будет запущено два раза.
PM MAIL   Вверх
Delphist
Дата 16.10.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(Akella @  16.10.2006,  16:59 Найти цитируемый пост)
if not init_mutex(UniqueString) then
   if hw <> 0 then
   begin
     setForeGroundWindow(hw);
     ShowWindow(hw,SW_SHOWNORMAL);
   end;

Окно отображается но его не удается свернуть. 



--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akella
Дата 16.10.2006, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



значит у тебя где-то проблема, т.к. у меня, и не только у меня, работает, уже давно работает этот код
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.0945 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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