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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.01.2015, 15:38
delphi_begin delphi_begin вне форума
Прохожий
 
Регистрация: 23.09.2011
Сообщения: 22
Репутация: 10
По умолчанию Загрузка формы из трея

Всем привет! Помогите, коли можете!

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

Для этого написал вот такой код:
Код:
var h:THandle;
........ 
  h:=FindWindow('TForm1', 'Пример');
   if h<>0 then begin

  ShowWindow(h, SW_SHOWNA);
  SetForegroundWindow(h);
 end
 else
  begin

  Application.Initialize;
и т.д.
  end;
Админ: очередной бан за несоблюдение правил форума по оформлению кода.

В результате, при повторном запуске форма появляется, но...
1) Не появляется на панели задач
2) Отображается без главного меню и кнопок (закрыть, развернуть, свернуть), т.е. без всей верхней части.


Вопрос, как решить такую проблему? Спасибо

Последний раз редактировалось Admin, 08.01.2015 в 15:45.
Ответить с цитированием
  #2  
Старый 08.01.2015, 19:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Я делал так.
В файле проекта:
Код:
function AllowSetForegroundWindow(dwProcessId: DWORD): BOOL; stdcall; external 'user32.dll';

function CanStart : Boolean;
var
  hMutex : THandle;
begin
  Result := True;

  WndMessage := RegisterWindowMessage(PChar(GetMessageName));

  hMutex := CreateMutex(Nil, True, PChar(GetMutexName));
  If hMutex<>0 Then
    If GetLastError=ERROR_ALREADY_EXISTS Then
      Begin
        AllowSetForegroundWindow(DWORD(-1));
        PostMessage(HWND_BROADCAST,WndMessage,0,0);
        Result := False;
      End;
end;

begin
  If CanStart Then
    Begin
      Application.Initialize;
      Application.Title := 'Visual Reminder';
      Application.CreateForm(TMainForm, MainForm);
      Application.HookMainWindow(MainForm.HookMessageProc);
      Application.Run;
    End;
end.

В главной форме:
Код:
type
  TMainForm = class TForm
  ..
    function HookMessageProc(var Message : TMessage) : Boolean;
  end;

var
  MainForm: TMainForm;
  WndMessage : Cardinal;

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;

Надеюсь, ничего не забыл...
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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