![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Всем привет! Помогите, коли можете!
Есть программа, которая сворачивается в трей. Использую компонент 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
|
|||
|
|||
|
Я делал так.
В файле проекта: Код:
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;Надеюсь, ничего не забыл... |