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

Вниз

запускать только одну копию программы...   Найти похожие ветки 

 
hawkins   (2004-04-07 14:42) [0]

Всем привет! Проблема такая: Хочу сделать возможность запускать только одну копию программы. После запуска первого же экземпляра появляется окно про-мы и тут же закрывается. В чем тут дело?
Делаю так:

 program Project1;
   uses Forms,Windows,
     Unit1 in "Unit1.pas" {Form1} ;
    {$R *.RES}

 var hwin:HWND;

   begin
    hwin:=FindWindow("TForm1","Form1");
      if hwin<>0 then begin
       SetForegroundWindow(hwin);
      Application.Terminate;
     end;
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
end.


 
panov ©   (2004-04-07 15:03) [1]

Слов больше нет.

http://delphimaster.net/view/1-1081149715/
http://delphimaster.net/view/1-1081149715/


 
Leonid ©   (2004-04-07 15:23) [2]

Вот нужный модуль.
Подключи его первым в секции Uses главной формы

unit MultInst;

interface

Uses Forms,Windows,Dialogs,SysUtils;
Function BroadcastSystemMessage(Flags:DWord;Recipients:PDWord;
        uiMessage:UInt;wwParam:wParam;llParam:lParam):LongInt;
        stdCall;External "User32.dll";
Const
    Mi_No_Error=0;
    Mi_Fail_SubClass=1;
    Mi_Fail_Create_Mutex=2;

Function GetMIError:Integer; //контроль ошибки при запуске приложения

implementation

Const
    UniqueAppStr:PChar="ShmWinEXE";
Var
  MessageID:Integer;
  WProc:TFNWndProc=nil;
  MutHandle:THandle=0;
  MiError:Integer=0;
Function GetMIError:Integer; //контроль ошибки при запуске приложения
begin
Result:=MIError
end;
//------------------------------------------------------------------------------
Function NewWndProc(Handle:hWnd;Msg:Integer;wParam,lParam:LongInt):LongInt;StdCall;
begin
if Msg=MessageID then //это-зарегистрированое сообщение
  begin
  if IsIconic(Application.Handle) then //если главная форма свёрнута-восстановить
      begin
//       Application.MainForm.WindowState:=wsMaximized;
      Application.Restore;
      end;
      SetForeGroundWindow(Application.MainForm.Handle);
   end
   else
   Result:=CallWindowProc(wProc,Handle,Msg,wParam,lParam);
end;
//------------------------------------------------------------------------------
Procedure SubClassApplication;
begin  //замена оконной процедуры
wProc:=TFNWndProc(SetWindowLong(Application.Handle,GWL_WNDPROC,LongInt(@NewWndProc)));
if wProc=nil then   //условие ошибки
  MiError:=MiError or Mi_Fail_SubClass;
end;
//------------------------------------------------------------------------------
Procedure DoFirstInstance;
begin
SubClassApplication;
MutHandle:=CreateMutex(nil,false,UniqueAppStr);
if MutHandle=0 then
  MiError:=MiError or Mi_Fail_Create_Mutex;
end;
//------------------------------------------------------------------------------
Procedure BroadcastFocusMessage;
Var
  BSMRecipients:DWord;
begin
Application.ShowmainForm:=false;
BSMRecipients:=BSM_APPLICATIONS;
BroadcastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
                      @BSMRecipients,MessageID,0,0);
Application.Terminate;
end;
//------------------------------------------------------------------------------
Procedure InitInstance;
begin
MutHandle:=OpenMutex(MUTEX_ALL_ACCESS,false,UniqueAppStr);
if MutHandle=0 then
  DoFirstInstance
  else
  BroadcastFocusMessage;
end;
//------------------------------------------------------------------------------
initialization
MessageID:=RegisterWindowMessage(UniqueAppStr);
InitInstance;
finalization
if wProc <> nil then
  SetWindowLong(Application.Handle,GWL_WNDPROC,LongInt(wProc));
end.



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

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

Наверх




Память: 0.46 MB
Время: 0.032 c
3-1080287554
stelius
2004-03-26 10:52
2004.04.25
Как определить принадлежность поля к таблице?


3-1080301555
gedd
2004-03-26 14:45
2004.04.25
Зашита базы Access


6-1076567699
FireMan_Alexey
2004-02-12 09:34
2004.04.25
WinSock.Select


1-1081160532
infom
2004-04-05 14:22
2004.04.25
Загрузка ресурса, что не так


1-1081251006
Aleksandr
2004-04-06 15:30
2004.04.25
Если я назначаю событие Application.OnException, как оно с try..?





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