DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: vic_168999
今日帖子: 7
在线用户: 17
导航: 论坛 -> 发布控件 斑竹:liumazi,ruralboy  
作者:
男 dwguo (dwguo) ★☆☆☆☆ -
盒子活跃会员
2005/3/12 16:18:12
标题:
[求助]:控制同一程序的打开次数? 浏览:1459
加入我的收藏
楼主: 请问各位高手:怎样控制同一个EXE文件在同一时间只能运行一次?
谢了!
----------------------------------------------
-
作者:
男 cnxxx (我本高手) ★☆☆☆☆ -
盒子活跃会员
2005/3/12 19:48:43
1楼: 论坛检索“互斥”。
----------------------------------------------
黑夜中,一眼望去,我就是高手。
作者:
男 supercat (supercat) ★☆☆☆☆ -
盒子活跃会员
2005/3/13 8:26:55
2楼: var
  MutexHandle: THandle;
begin
  MutexHandle := CreateMutex(nil, TRUE, 'Application程序的标题,不是Form的标题');
  if MutexHandle <> 0 then
  begin
    if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      MessageBox(0, '对不起,程序已经运行........','警告:', mb_IconHand);
      CloseHandle(MutexHandle);
      Halt;
    end;
  end;
----------------------------------------------
-奔着小康前去,所以要更加努力
作者:
男 39459366 (jasonzjp) ★☆☆☆☆ -
盒子活跃会员
2005/3/13 18:26:57
3楼: 最好是用:findwindow()这个函数!
----------------------------------------------
-
作者:
男 ruralboy (青瓜白菜番茄红) ★☆☆☆☆ -
盒子活跃会员
2005/3/16 22:25:42
4楼: 要用 FindWindow 就要 CreateParams 一下设置一下 ClassName 。

个人比较喜欢 FindWindow ,互拆方法存在 BUG 。
----------------------------------------------
作者:
男 dwguo (dwguo) ★☆☆☆☆ -
盒子活跃会员
2005/3/17 9:40:49
5楼: 谢谢,我试一下
----------------------------------------------
-
作者:
男 rsjd (rsjd) ★☆☆☆☆ -
盒子活跃会员
2005/3/17 10:51:05
6楼: 在工程中引用下面这个单元即可:
//==========
// Unit Name: MultInst
// Author   : ysai
// Date     : 2003-05-20
// Purpose  : 解决应用程序多实例问题
// History  :
//==========

//==========
// 工作流程
// 程序运行先取代原有向所有消息处理过程,然后广播一个消息.
// 如果有其它实例运行,收到广播消息会回发消息给发送程序,并传回它自己的句柄
// 发送程序接收到此消息,激活收到消息的程序,然后关闭自己
//==========
unit MultInst;

interface

uses
  Windows ,Messages, SysUtils, Classes, Forms;

implementation

const
  STR_UNIQUE    = '{2BE6D96E-827F-4BF9-B33E-8740412CDE96}';
  MI_ACTIVEAPP  = 1;  //激活应用程序
  MI_GETHANDLE  = 2;  //取得句柄

var
  iMessageID    : Integer;
  OldWProc      : TFNWndProc;
  MutHandle     : THandle;
  BSMRecipients : DWORD;

function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):
  Longint; stdcall;
begin
  Result := 0;
  if Msg = iMessageID then
  begin
    case wParam of
      MI_ACTIVEAPP: //激活应用程序
        if lParam<>0 then
        begin
          //收到消息的激活前一个实例
          //为什么要在另一个程序中激活?
          //因为在同一个进程中SetForegroundWindow并不能把窗体提到最前
          if IsIconic(lParam) then
          OpenIcon(lParam)
          else
          SetForegroundWindow(lParam);
          //终止本实例
          Application.Terminate;
        end;
      MI_GETHANDLE: //取得程序句柄
        begin
          PostMessage(HWND(lParam), iMessageID, MI_ACTIVEAPP,
          Application.Handle);
        end;
    end;
  end
  else
    Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);
end;

procedure InitInstance;
begin
  //取代应用程序的消息处理
  OldWProc    := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC,
    Longint(@NewWndProc)));

  //打开互斥对象
  MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, STR_UNIQUE);
  if MutHandle = 0 then
  begin
    //建立互斥对象
    MutHandle := CreateMutex(nil, False, STR_UNIQUE);
  end
  else begin
    Application.ShowMainForm  :=  False;
    //已经有程序实例,广播消息取得实例句柄
    BSMRecipients := BSM_APPLICATIONS;
    BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE,
        @BSMRecipients, iMessageID, MI_GETHANDLE,Application.Handle);
  end;
end;

initialization
  //注册消息
  iMessageID  := RegisterWindowMessage(STR_UNIQUE);
  InitInstance;

finalization
  //还原消息处理过程
  if OldWProc <> Nil then
    SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));

  //关闭互斥对象
  if MutHandle <> 0 then CloseHandle(MutHandle);

end.
----------------------------------------------
-
作者:
男 dwguo (dwguo) ★☆☆☆☆ -
盒子活跃会员
2005/3/17 12:18:38
7楼: 非常感谢6楼用户,用起来没问题。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS