VC++ 只运行一个程序实例

来源:互联网 发布:mac u盘复制文件 编辑:程序博客网 时间:2024/05/17 22:37

源代码如下:

#pragma once



#define  DECLARE_SinglePrj   SinglePrj* SinglePrj::m_pSinglePrj = NULL;



#define  SinglePrj_InitInstance(szPropName)    SinglePrj *pSinglePrj = SinglePrj::GetInstance();\
if (NULL != pSinglePrj)\
if(!pSinglePrj->InitInstance(szPropName)) return FALSE;




#define SinglePrj_OnInitDialog    SinglePrj *pSinglePrj = SinglePrj::GetInstance(); \
if (NULL != pSinglePrj)  pSinglePrj->OnInitDialog(m_hWnd);




class SinglePrj
{
public:
static SinglePrj *m_pSinglePrj;
static SinglePrj *GetInstance()
{
if (NULL == m_pSinglePrj) m_pSinglePrj = new SinglePrj();

return m_pSinglePrj;
}


bool InitInstance(CString   szPropName)
{
m_szPropName = szPropName;
m_hValue = (HANDLE)1;




HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd);


if (NULL == oldHWnd) return true;



::ShowWindow(oldHWnd,SW_SHOW);
::SetForegroundWindow(oldHWnd);
return false;
}
void OnInitDialog(HWND hwnd)
{
SetProp(hwnd,m_szPropName,m_hValue);
}
private:
static BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam)
{
SinglePrj * pSinglePrj = GetInstance();
if (NULL == pSinglePrj) return false;

HANDLE h = GetProp(hwnd,pSinglePrj->m_szPropName);
if( h == pSinglePrj->m_hValue)
{
*(HWND*)lParam = hwnd;
return false;
}


return true;
}
private:
SinglePrj(){}
CString   m_szPropName;
HANDLE   m_hValue;
};



使用方法:


以程序名为 _T("Test") 为例

1.任意cpp中声明宏

DECLARE_SinglePrj


2.程序初始化函数中声明宏:

SinglePrj_InitInstance( _T("Test") )


2.窗体初始化函数中声明宏:

SinglePrj_OnInitDialog