一 引言
程序单一运行就是在一个操作系统中,一个程序只有一个实例在系统中运行.比如千千静听,你无法在系统中运行两个千千静听的实例.
二 需求描述
- 程序的单一运行
- 当系统中已有一个程序运时,将改程序的窗口激活并最大化.
三 实现概述
1,使用CreateMutex创建一个全局互斥量,并且使用SetProp往MainWnd中添加一个新项.
2,当第二个程序的实例在InitInstance的时候,CreateMutex会失败,并且GetLastError()会得到一个ERROR_ALREADY_EXISTS的错误代码.
3,枚举MainWnd中的CWnd,如果发现该CWnd,那么将其最大化.
四 所使用到的Win32 API以MFC库
CreateMutex
创建一个互斥体(MUTEX)
CWnd::GetDesktopWindow()
函数功能:该函数返回桌面窗口的句柄。桌面窗口覆盖整个屏幕。桌面窗口是一个要在其上绘制所有的图标和其他窗口的区域。
CWnd::GetWindow
该函数返回与指定窗口有特定关系(如Z序或所有者)的窗口句柄。
BOOL SetProp(HWND hWnd,LPCTSTR lpString,HANDLE hData);
函数功能:该函数在指定窗口的属性表中增加一个新项,或者修改一个现有项。如果指定的字符串不在属性表中,那么就增加该新的项,新项中包含该字符串和句柄,否则就用指定的句柄替换该字符串的全前句柄。
函数功能:该函数在指定窗口的属性表中增加一个新项,或者修改一个现有项。如果指定的字符串不在属性表中,那么就增加该新的项,新项中包含该字符串和句柄,否则就用指定的句柄替换该字符串的全前句柄。
HANDLE GetProp(HWND hWnd,LPCTSTR lpString);
函数功能:该函数从给定窗口的属性列表中检索数据句柄。给定的字符串标识了要检索的句柄。该字符串和句柄必须在前一次调用SetProp函数时已经加到属性表中。
五 实现代码
在CSingleInstanceApp::InitInstance()中添加.
在CMainFrame中加入WM_DESTROY的处理代码