Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.12.2013, 13:46
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию Вниманию Гуру

Уважаемые,

пытаюсь сделать: при попытке пользователя запустить второй экземпляр программы, отобразить первый, несмотря на его состояние (свернут, не активен..)

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

баг: после восстановления окна первого экземпляра не работает функция сворачивания окна. При этом закрыть окно и максимизировать его возможно.

Код:
h :=  FindWindow('TfrmMain','%form_title%');

    if h <> 0 then
       begin

       //если окно не отображено на экране
       //то максимизировать его
       if not IsWindowVisible(h) then
          ShowWindow(h,sw_showmaximized);

       //выставляем окно на передний план          
          SetForeGroundWindow(h);
       end
    else
       begin
       Application.Initialize;
       ...
       Application.Run;
       end;
Ответить с цитированием
  #2  
Старый 02.12.2013, 14:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
procedure BringToFront(AHandle: HWND);
var
  AThreadId: Cardinal;
  AProcessId: Cardinal;
begin
  AThreadId:=GetCurrentThreadId;
  AProcessId:=GetWindowThreadProcessId(GetForegroundWindow, nil);
  AttachThreadInput(AThreadId, AProcessId, True);
  ShowWindow(AHandle, SW_RESTORE);
  SetForegroundWindow(AHandle);
  AttachThreadInput(AThreadId, AProcessId, False);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 02.12.2013, 14:38
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Не помогло
Ответить с цитированием
  #4  
Старый 02.12.2013, 15:21
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

это работает? http://zalil.ru/34833170
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 02.12.2013 в 15:38.
Ответить с цитированием
  #5  
Старый 02.12.2013, 15:34
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

А нельзя закинуть на нормальный файлообменник? А то мне не скачать.
Ответить с цитированием
  #6  
Старый 02.12.2013, 15:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

http://zalil.ru/34833170
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 02.12.2013, 15:53
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

Программа запускается (DownloaderLite.exe). В ней всё прекрасно работает.
Ответить с цитированием
  #8  
Старый 02.12.2013, 16:01
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Мое мнение - все дело в параметре sw_showmaximized в ShowWindow. Используй вместо него sw_Restore или т.п. Наверное, система просто показывает окно, не давая себе отчет, что оно развернутое, считая его и дальше свернутым.
Ответить с цитированием
  #9  
Старый 02.12.2013, 16:11
Кодер Кодер вне форума
Активный
 
Регистрация: 25.02.2008
Сообщения: 395
Репутация: -599
По умолчанию

По вышеуказанному примеру NumLock'a выполнял SW_RESTORE, однако изменений не заметил.
Ответить с цитированием
  #10  
Старый 02.12.2013, 16:35
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

А так?
Код:
  Application.Initialize;
  h :=  FindWindow('TForm1','ABCD');

    if h <> 0 then
       begin

     
       if not IsWindowVisible(h) then
          ShowWindow(h,SW_RESTORE);

        setWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0,SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE);
       end
    else
  begin

  Application.CreateForm(TForm1, Form1);
  Application.Run;
  end;
ЗЫ ShowWindow(h,SW_RESTORE); уже не нужно, забыл закомментить.

Последний раз редактировалось YVitaliy, 02.12.2013 в 16:39.
Ответить с цитированием
  #11  
Старый 02.12.2013, 17:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

на самом деле все зависит от версии Delphi. либо от VCL или API.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 02.12.2013, 17:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

У меня вот такой код работает, вроде, стабильно:
Код:
function TMainForm.HookMessageProc(var Message: TMessage): Boolean;
begin
  Result := False;
  If Message.Msg = WndMessage Then
    Begin
      TrayIcon.ShowMainForm;
      Application.BringToFront;
      SetForegroundWindow(Self.Handle);
      Result := True;
    End;
end;

TrayIcon - это, на самом деле, TCoolTrayIcon.
Собственно, там есть только одна закавыка. Под Vista и 7 надо что бы второй экземпляр отдал разрешение на всплытие окна другого процесса, иначе операционка откажется его активировать.
Ответить с цитированием
  #13  
Старый 02.12.2013, 17:46
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Такой глюк возникает из-за того, что в ShowWindow нужно указывать хэндл не "главной" формы, а главного окна, т.е. Application.

У себя я делал проще - создавал собственное сообщение - примерно так:
Код:
const
  MY_RESTORE = WM_APP + 1;

type
  TfrmMain = class(TForm)
.....
  private
    { Private declarations }
    procedure MyRestore(var Message: TMessage); message MY_RESTORE;
.....
implementation
.....
procedure TfrmMain.MyRestore(var Message: TMessage);
begin
  Application.Restore;
end;

тогда в файле проекта будет примерно так:
Код:
var
  h: HWND;
begin
  h := FindWindow('TfrmMain', '%form_title%');

  if h <> 0 then
  begin
    SendMessage(h, MY_RESTORE, 0, 0);
    SetForeGroundWindow(h);
  end else
  begin
    Application.Initialize;
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  end;
end.
Ответить с цитированием
  #14  
Старый 02.12.2013, 22:18
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Вариантов существует множество, я использую Mutex.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #15  
Старый 03.12.2013, 00:03
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Присоединяюсь к варианту poli-smen, много раз делал при помощи обработки Message - всё работало прекрасно.

P.S. Рекламу из подписи таки стоит убрать, ибо
Цитата:
Сообщение от Правила
2.6. Пользовательская подпись не должна превышать 4 строк (включая пустые), и не должна содержать ссылок (ссылку на свой сайт Вы можете вставить в соответствующее поле профиля). Рекламируйте себя другими способами, форум не рекламная площадка.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj

Последний раз редактировалось PhoeniX, 03.12.2013 в 00:07.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:36.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025