![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторный запуск программы [D6, 2000, XP]
Mishenka © (2006-11-28 11:20:00)Есть программа, которая висит в трее. Как сделать, чтоб при попытке её повторного запуска, она не запускалась второй раз, а просто всплывало её главное окно?
Сергей М. (2006-11-28 12:22:00) [21]
> Причем здесь локальная политика?
> Автор спрашивает как написать такое
"Такое" = "она не запускалась второй раз ..".
Где и как твоем коде (или в коде alex810) это достигается ?
Да нигде и никак).. Сколько раз юзер жмакнет на иконке, столько процессов и будет стартовано) ... см. [6] и не вводи автора в заблуждение)
Elen (2006-11-28 12:13:00) [22]
> Потому что эта фича в лок.политиках безопасности не реализована.
> За очевидной ненадобностью.
Причем здесь локальная политика? Автор спрашивает как написать такое. Не нужно автора вводить в заблуждение.!
Elen (2006-11-28 12:08:00) [23]
> Mishenka
Порули вот такое :
program Project1;
uses
Forms,
windows,
Unit1 in 'Unit1.pas' {Form1};
var hMappedFile: THandle;
{$R *.res}
begin
Application.Initialize;
if OpenFileMapping(FILE_MAP_ALL_ACCESS,true,'SharedBlock')=0
then begin
hMappedFile:=CreateFileMapping ($FFFFFFFF, nil, PAGE_READWRITE,
0, 255, 'SharedBlock');
Application.CreateForm(TForm1, Form1);
Application.Run;
end else Application.MessageBox('sdfdf','adasd');
end.
Для разгону мысли ;) А в проекте можеш писать че угодно. Здесь вместо МессагеБокса можеш активить нужную форму, например хендель которой запихнеш в этот МапФайл
Сергей М. (2006-11-28 12:06:00) [24]
> Elen © (28.11.06 12:00) [4]
Потому что эта фича в лок.политиках безопасности не реализована. За очевидной ненадобностью.
ЮЮ (2006-11-28 12:02:00) [25]Она же всё равно запустится. Только снимется сама же :)
alex810 (2006-11-28 12:01:00) [26]Еще на запрет повторного запуска
program SlideShow;
Forms, Windows,
slide in 'slide.pas1 {Forml};
80 Глава 4
I$R *.resl
var pbuff:array[O..127] of char; {буфер для текста)
var dWin: HWnd; {дескриптор!
var st:string; (вспомогательная строка)
begin
Application.Initialize;
Application.Title := 'SlideShow1;
dWin:= GetWindow(Application.Handle, GW_HWNDFIRST);
while dWin <> 0 do
begin
if (dWin <> Application.Handle) and
{собственное окно игнорируем)
(GetWindow(dWin, GW_OWNER) = 0) and
{дочерние окна игнорируем)
(GetWindowText(dWin, pbuff, sizeof(pbuff)) <> 0)
{без названия игнорируем)
then
begin
GetWindowText(dWin, pbuff, sizeof(pbuff));
(получаем текст названия приложения)
st:-string(pbuff); {переводим его в строку)
if st='SlideShow1 then
begin
st:='"flBoe пернатых в одной клетке не живут." @А.Лебедь';
Application.MessageBox(Pchar(st),'',MB_OK);
(выводим предупреждение)
exit; {прерываем программу)
end;
end;
dWin:= GetWindow(dWin, GW_HWNDNEXT);
{ищем следующее приложение из списка)
end;
Application.CreateForm(TForml, Forml);
Application.Run;
end.
Elen (2006-11-28 12:00:00) [27]
>
> [2] Сергей М. © (28.11.06 11:58)
>
> > Как сделать, чтоб при попытке её повторного запуска, она
>
> > не запускалась второй раз
>
>
> Никак.
Почему никак?
ЮЮ (2006-11-28 11:59:00) [28]a UniqueKey не мешало бы чего-нибудь действительно уникальное присвоить :)
Сергей М. (2006-11-28 11:58:00) [29]
> Как сделать, чтоб при попытке её повторного запуска, она
> не запускалась второй раз
Никак.
alex810 (2006-11-28 11:53:00) [30]Не знаю может подойдет. Могу еще накидать.
var
MutexHandle: THandle;
var
UniqueKey: string;
function IsNextInstance: BOOLEAN;
begin
Result := FALSE;
MutexHandle := 0;
MutexHandle := CREATEMUTEX(nil, TRUE, UniqueKey);
if MutexHandle <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
Result := TRUE;
CLOSEHANDLE(MutexHandle);
MutexHandle := 0;
end;
end;
end;
begin
CmdShow := SW_HIDE;
MessageId := RegisterWindowMessage(zAppName);
Application.Initialize;
if IsNextInstance then
PostMessage(HWND_BROADCAST, MessageId, 0, 0)
else
begin
Application.ShowMainForm := FALSE;
Application.CreateForm(TMainForm, MainForm);
MainForm.StartTimer.Enabled := TRUE;
Application.Run;
end;
if MutexHandle <> 0 then
CLOSEHANDLE(MutexHandle);
end.
В MainForm необходимо вставить обработчик внутреннего сообщения
procedure TMainForm.OnAppMessage(var M: TMSG; var Ret: BOOLEAN);
begin
if M.Message = MessageId then
begin
Ret := TRUE;
// Поместить окно наверх !!!!!!!!
end;
end;
initialization
ShowWindow(Application.Handle, SW_Hide);
end.