EXE只能运行一个...

把这个单元引用到主窗体中就可以了...经试验有效.

 

 

unit  RunOne;
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;
const
  UniqueAppStr 
=   ' ShuanYuan_SoftWare ' ;
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 .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值