限制程序多开

来源:互联网 发布:巡视利剑观后感 知乎 编辑:程序博客网 时间:2024/04/29 04:07

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单实例"));

原创粉丝点击