Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

О запуске приложения   Найти похожие ветки 

 
bigfoot ©   (2004-08-01 04:50) [0]

У меня приложение висит в трее (а иногда даже без иконки). Как сделать, чтобы при попытке открыть новый экз. приложения открывалась главная форма, но кол-во запущенных приложений не
изменилось (1, соответственно :) )?
Я, например, делал так:
при вызове обрабатывается OnCreate:
...//обработка всех окон
...//Wnd - "предыдущее" наше приложение
destroyWindow(Wnd);
...
а далее грузить уже главную форму. но во первых ошибка, а во вторых есть же что-нибудь по-интереснее и эффективнее...


 
Кириешки ©   (2004-08-01 07:32) [1]

Prosedure Tform1.OnCreate(...);
begin
if findwindow(nil,"New Text Document.txt - Notepad")<>0 then
   begin
     showmessage("Программа уже запущена");
     halt;
   end;
end;

Немного по деревенски, но зато вполен рабочая версия.


 
Sun bittern ©   (2004-08-01 09:12) [2]

{
Copyright © 1998 by Delphi 5 Developer"s Guide - Xavier Pacheco and Steve Teixeira
}

unit MultInst;

interface

const
 MI_QUERYWINDOWHANDLE   = 1;
 MI_RESPONDWINDOWHANDLE = 2;

 MI_ERROR_NONE          = 0;
 MI_ERROR_FAILSUBCLASS  = 1;
 MI_ERROR_CREATINGMUTEX = 2;

// Call this function to determine if error occurred in startup.
// Value will be one or more of the MI_ERROR_* error flags.
function GetMIError: Integer;

implementation

uses Forms, Windows, SysUtils;

const
 UniqueAppStr = "DDG.I_am_the_Eggman!";

var
 MessageId: Integer;
 WProc: TFNWndProc;
 MutHandle: THandle;
 MIError: Integer;

function GetMIError: Integer;
begin
 Result := MIError;
end;

function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
 Longint; stdcall;
begin
 Result := 0;
 // If this is the registered message...
 if Msg = MessageID then
 begin
   case wParam of
     MI_QUERYWINDOWHANDLE:
       // A new instance is asking for main window handle in order
       // to focus the main window, so normalize app and send back
       // message with main window handle.
       begin
         if IsIconic(Application.Handle) then
         begin
           Application.MainForm.WindowState := wsNormal;
           Application.Restore;
         end;
         PostMessage(HWND(lParam), MessageID, MI_RESPONDWINDOWHANDLE,
           Application.MainForm.Handle);
       end;
     MI_RESPONDWINDOWHANDLE:
       // The running instance has returned its main window handle,
       // so we need to focus it and go away.
       begin
         SetForegroundWindow(HWND(lParam));
         Application.Terminate;
       end;
   end;
 end
 // Otherwise, pass message on to old window proc
 else
   Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;

procedure SubClassApplication;
begin
 // We subclass Application window procedure so that
 // Application.OnMessage remains available for user.
 WProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
   Longint(@NewWndProc)));
 // Set appropriate error flag if error condition occurred
 if WProc = nil then
   MIError := MIError or MI_ERROR_FAILSUBCLASS;
end;

procedure DoFirstInstance;
// This is called only for the first instance of the application
begin
 // Create the mutex with the (hopefully) unique string
 MutHandle := CreateMutex(nil, False, UniqueAppStr);
 if MutHandle = 0 then
   MIError := MIError or MI_ERROR_CREATINGMUTEX;
end;

procedure BroadcastFocusMessage;
// This is called when there is already an instance running.
var
 BSMRecipients: DWORD;
begin
 // Prevent main form from flashing
 Application.ShowMainForm := False;
 // Post message to try to establish a dialogue with previous instance
 BSMRecipients := BSM_APPLICATIONS;
 BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
   @BSMRecipients, MessageID, MI_QUERYWINDOWHANDLE,
   Application.Handle);
end;

procedure InitInstance;
begin
 SubClassApplication;   // hook application message loop
 MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);
 if MutHandle = 0 then
   // Mutex object has not yet been created, meaning that no previous
   // instance has been created.
   DoFirstInstance
 else
   BroadcastFocusMessage;
end;

initialization
 MessageID := RegisterWindowMessage(UniqueAppStr);
 InitInstance;
finalization
 // Restore old application window procedure
 if WProc <> Nil then
   SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));
 if MutHandle <> 0 then CloseHandle(MutHandle);  // Free mutex
end.


 
тихий вовочка ©   (2004-08-01 11:29) [3]

Я делал в файле проекта, еще до Application.Initialize
var hwnd : DWORD;

hwnd := FindWindow("TMainForm","My cool program");
if hwnd <> 0 then
 begin
   MessageBox(0,"Program is already run","My cool program",0);
   Exit
 end;

Можно туда добавить еще и PostMessage для активации запущенного экземпляра



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.041 c
14-1090806998
Думкин
2004-07-26 05:56
2004.08.15
С днем рождения! 26 июля


14-1091284985
Водитель трамвая
2004-07-31 18:43
2004.08.15
Хочу убить свой винт с почестями. Как это сделать?


14-1091008304
Esu
2004-07-28 13:51
2004.08.15
Забавно и жизненно :)))


4-1089132842
Луарвик
2004-07-06 20:54
2004.08.15
Модуль ShlObj (Win32 API Shell objects Interface Unit)


3-1090280687
bigfoot
2004-07-20 03:44
2004.08.15
Вопрос по синтаксису запроса в TQUERY





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский