Форум: "WinAPI";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизПерезапуск приложения Найти похожие ветки
← →
ronyn (2005-08-16 00:32) [0]Для того, чтобы мое приложение не запускалось, если оно уже запущено,я использую следующий код:
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure WMCopyData(var msg: TMessage); message WM_COPYDATA;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
checkinst;
procedure TForm1.FormCreate(Sender: TObject);
var
h : HWND;
begin
h := SetUniqueUID(Handle, 123456); // назначаем уникальный идентификатор
if h <> Handle then
begin
SendString(h, GetCommandLineStr, Handle, 0);
ActivatePrevInstance(h);
Halt;
end;
end;
procedure TForm1.WMCopyData;
begin
Memo1.Lines.CommaText := PChar(PCopyDataStruct(msg.LParam).lpData);
end;
когда я возобновляю окно из трея, то этот код реагирует, как на открытие программы.
← →
GanibalLector © (2005-08-16 01:14) [1]
var hSemaphore:THandle;
begin
hSemaphore:=CreateSemaphore(nil,0,1,pChar("C31AAF3F-1CEB-487D-8E7D-267D977DB9A3"));
try
if GetLastError = ERROR_ALREADY_EXISTS then Exit;
Application.Initialize;
Application.Title:="STC-Istok :) ";
Application.CreateForm(TForm1, Form1);
...
Application.CreateForm(TForm26, Form26);
Application.Run;
finally
ReleaseSemaphore(hSemaphore,1,nil);
CloseHandle(hSemaphore);
end;
end.
← →
Leonid Troyanovsky © (2005-08-16 09:09) [2]
> GanibalLector © (16.08.05 01:14) [1]
> hSemaphore:=CreateSemaphore(nil,0,1,pChar("C31AAF3F-1CEB-487D-
Используя memory mapped file можно передать стартующему,
например, хендл окна работающего, для его активации.
Т.е., добавив пару строк кода получаем массу
дополнительных возможностей.
--
Regards, LVT.
← →
GanibalLector © (2005-08-17 02:09) [3]2 Leonid Troyanovsky © (16.08.05 09:09) [2]
Дык...покажите.Не стесняйтесь ;)
← →
Leonid Troyanovsky © (2005-08-17 09:17) [4]
> GanibalLector © (17.08.05 02:09) [3]
> Дык...покажите.Не стесняйтесь ;)
http://groups-beta.google.com/group/borland.public.delphi.database.sqlservers/msg/b7801d3979e95169
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-08-17 09:24) [5]
> ronyn (16.08.05 00:32)
> когда я возобновляю окно из трея, то этот код реагирует,
> как на открытие программы.
А как ты возобновляешь окно?
Его, собс-но, нужно лишь показывать-скрывать.
--
Regards, LVT.
← →
Zhenya (2005-09-20 08:16) [6]var
Wnd:hWnd;
begin
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO
BEGIN
IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0) THEN
BEGIN
GetWindowText (Wnd, buff, sizeof (buff ));
IF StrPas (buff) = Application.Title THEN
BEGIN
MessageDlg("Ïðèëîæåíèå óæå çàãðóæåíî", mtWarning, [mbOk], 0);
Halt;
END;
END;
Wnd := GetWindow (Wnd, gw_hWndNext);
END;
end;
← →
user51 (2005-09-22 13:26) [7]В файле проекта пишешь
HPrevInst:= FindWindow("TForm1",nil);
if HPrevInst = 0 then
begin
Application.Initialize;
Application.CreateForm(TForm1, FForm1);
Application.Run;
end
else
begin
ShowMessage("программа уже была загружена ...");
Windows.SetFocus(HPrevInst);
Windows.SetForegroundWindow(HPrevInst);
end;
end;
end;
← →
ANB © (2005-09-23 11:27) [8]
> user51 (22.09.05 13:26) [7]
- тут надо класс главной формы похитрее придумать.
← →
umbra © (2005-09-23 11:56) [9]можно при запуске создавать файл myprog.pid и записывать туда идентификатор процесса проги и не закрывать до окончания работы программы. При запуске проверять, существует ли этот файл и можно ли его удалить. Если существует и удалить можно, то это в прошлый раз аварийно завершилась программа. Если удалить нельзя, то значит это второй экземпляр.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c