现在的位置: 首页 > 综合 > 正文

限制程序多开

2013年10月16日 ⁄ 综合 ⁄ 共 1453字 ⁄ 字号 评论关闭

http://www.cctry.com/thread-38070-1-3.html

1.创建新节法

为程序加入一个全局变量,让这个全局变量可以被程序的多个实例所共享,每当程序实例运行时就对该全局变量进行修改。通过访问该全局变量,就可以知道有多少个实例在运行了。当然,为了系统的安全和稳定性,默认情况下是不允许这样做得。为了阻止这种事情的发生,系统使用了copy-on-write(写入时拷贝)机制,不过我们可以使用创建新节的方法来绕过它。

#pragma data_seg("Shared") 
HWND hWnd=NULL; 
#pragma data_seg() 
#pragma comment(linker, "/Section:Shared,RWS") 

初始化函数中:
if (hWnd==NULL) 
{ 
    hWnd=m_hWnd; 
} 
else 
{ 
    AfxMessageBox(_T("只允许运行一个实例!")); 
    ::SetForegroundWindow(hWnd); 
    ExitProcess(0); 
} 

2.互斥体法
缺点是无法激活旧窗口,可以用CreateMutex,CreateEvent,OpenMutex等API实现

hObject=CreateMutex(NULL,FALSE,_T("互斥体")); 
if (GetLastError()==ERROR_ALREADY_EXISTS) 
{ 
    AfxMessageBox(_T("只允许运行一个实例!")); 
    ExitProcess(0); 
} 

3.查找窗口标题法
1.FindWindow

初始化函数中

hObject=CreateMutex(NULL,FALSE,_T("互斥体")); 
if (GetLastError()==ERROR_ALREADY_EXISTS) 
{ 
    AfxMessageBox(_T("只允许运行一个实例!")); 
    ExitProcess(0); 
} 

2.EnumWindows

BOOL CALLBACK MyEnumWndProc(HWND hwnd,LPARAM lParam) 
{ 
    TCHAR szCaption[256]={0}; 
    GetWindowText(hwnd,szCaption,256); 
    if (_tcscmp(_T("EnumWindows单实例"),szCaption)==0) 
    { 
        AfxMessageBox(_T("只允许运行一个实例!")); 
        ::SetForegroundWindow(hwnd); 
        ExitProcess(0); 
    } 
    return TRUE; 
} 

初始化函数中

EnumWindows(MyEnumWndProc,NULL); 
SetWindowText(_T("EnumWindows单实例")); 

3.GetWindow

TCHAR szCaption[MAX_PATH]={0};
HWND hWnd=::GetWindow(::GetDesktopWindow(), GW_CHILD);
while(hWnd!=NULL)
{
    ::GetWindowText(hWnd,szCaption,MAX_PATH);
    if (_tcscmp(_T("GetWindow单实例"),szCaption)==0)
    {
        AfxMessageBox(_T("只允许运行一个实例!"));
        ::SetForegroundWindow(hWnd);
        ExitProcess(0);
    }
    hWnd=::GetWindow(hWnd, GW_HWNDNEXT);
}
SetWindowText(_T("GetWindow单实例"));

抱歉!评论已关闭.