Главная страница
    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.039 c
6-1087045291
Никита
2004-06-12 17:01
2004.08.15
Подключение к интернету при помощи Delphi


4-1088605120
Paulik
2004-06-30 18:18
2004.08.15
Странность в работе с DLL под Delphi и Visual Basic


14-1091006892
Vlad Oshin
2004-07-28 13:28
2004.08.15
Дроздов (в мире животных) выпускает муз.диск :)


14-1090716682
Soft
2004-07-25 04:51
2004.08.15
AI, для всех гикнутых хакеров на этом форуме.


11-1078154025
ctapik
2004-03-01 18:13
2004.08.15
Занимаемая память программы (Task manager)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский