正文

禁止多实例运行2008-08-21 15:08:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/MYIT/37768.html

分享到:

program Project1; uses  Windows,  Forms,  Unit1 in 'Unit1.pas' {Form1},  Function_U in 'E:\工作\JJQDS_V2\Function_U.pas',  Config_U in 'E:\工作\JJQDS_V2\Config_U.pas'; {$R *.res} var  hAppMutex : THandle; begin  Application.Initialize;  hAppMutex := CreateMutex(nil,False,PChar('{19D51511-8490-42AC-B677-E3D59AF822B1}'));  if hAppMutex = 0 then  begin    MessageBox(0,PChar('创建互斥对象失败!'),PChar('Error'),MB_OK + MB_ICONINFORMATION);    Exit;  end;  if (hAppMutex <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then  begin    MessageBox(0,PChar('不是第一次运行这个程序!'),PChar('OK'),MB_OK + MB_ICONINFORMATION);    CloseHandle(hAppMutex);    Exit;  end;    Application.CreateForm(TForm1, Form1);  Application.Run;  CloseHandle(hAppMutex);end. ======================================================================= m_hMutex=CreateMutex(NULL,FALSE,m_pAppName);   //HANDLE   m_hMutex;     if(GetLastError()==ERROR_ALREADY_EXISTS)     {     HWND   hWnd=::FindWindow(NULL,m_pAppName);     if(hWnd)     {     if(::IsIconic(hWnd))     ::ShowWindow(hWnd,SW_RESTORE);     ::SetForegroundWindow(hWnd);     ::SetForegroundWindow(::GetLastActivePopup(hWnd));     }     else     MessageBox(NULL,"您的程序已经运行了","提示信息",MB_ICONINFORMATION);     return   FALSE;     } ======================================================================== 以下代码尚不能激活已经运行的实例,你试着该以下吧,改好请贴出来。                       //在   InitInstance   中,创建信号量:     HANDLE   hSem   =   CreateSemaphore(NULL,1,1,m_pszAppName);     //信号量已存在?     if(GetLastError()   ==   ERROR_ALREADY_EXISTS)     {     //关闭信号量句柄     CloseHandle(hSem);     //寻找先前实例的主窗口     HWND   hWndPrevious   =   ::GetWindow(::GetDesktopWindow(),GW_CHILD);     while(::IsWindow(hWndPrevious))     {     //检查窗口是否有预设的标记?     //有,则是我们寻找的主窗口     if(::GetProp(hWndPrevious,m_pszAppName))     {     //主窗口已经最小化,则恢复其大小     if(::IsIconic(hWndPrevious))     ::ShowWindow(hWndPrevious,SW_RESTORE);     //将主窗口激活     ::SetForegroundWindow(hWndPrevious);     //将主窗口对话框激活     ::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));     //退出本实例     reture   FALSE;     }     else     //继续寻找下一个窗口     hWndPrevious   =   ::GetWindow(hWndPrevious,GW_HWNDNEXT);         }     //前一实例已存在,但找不到其主窗口     //可能出错了     //退出本实例     return   FALSE;     }

阅读(2283) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册