original addressccrun(老妖)提供的
一、通過(guò)創(chuàng)建互斥量來(lái)判斷:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
HANDLE hMutex = CreateMutex(NULL, TRUE, "MyAppMutex");
if(NULL == hMutex)
{
MessageBox(NULL, "創(chuàng)建Mutex失敗!",
Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
return 0;
}
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
::MessageBox(NULL, "已經(jīng)運(yùn)行了一個(gè)實(shí)例!",
Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
ReleaseMutex(hnd);
return 0;
}
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
二、用系統(tǒng)原子
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
const char *Atom = "SingleApp";
try
{
if (GlobalFindAtom(Atom) != 0) // 在系統(tǒng)原子表中找原子
{
::MessageBox(NULL, "已經(jīng)運(yùn)行了一個(gè)實(shí)例!",
Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
return 0;
}
GlobalAddAtom(Atom); // 增加原子
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
GlobalDeleteAtom(GlobalFindAtom(Atom)); // 刪除原子
return 0;
}
三、通過(guò)FindWindow函數(shù)來(lái)判斷:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
HWND hForm = FindWindow("TForm1", "Form1");
if(NULL != hForm)
{
::MessageBox(NULL, "已經(jīng)運(yùn)行了一個(gè)實(shí)例!",
Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
return 0;
}
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
四、通過(guò)內(nèi)存映射來(lái)還原窗口:
PHANDLE lpMainWin;
HANDLE hMap;
bool bExist;
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
hMap = CreateFileMapping(
(HANDLE)0xFFFFFFFF, // 要映射的文件名,使用0xFFFFFFFF是說(shuō)明不使用真實(shí)文件,而是在頁(yè)面文件上創(chuàng)建內(nèi)存
NULL, // 安全屬性
PAGE_READWRITE, // 訪問(wèn)權(quán)限,讀寫(xiě)都要
0, // 最大內(nèi)存的高位
4, // 最大內(nèi)存的低位,最大內(nèi)存有4字節(jié)就夠了,只需要放一個(gè)窗體的句柄
"MyProjectFlag" // 映射名字,這個(gè)應(yīng)該是本程序獨(dú)有的,和其他程序不沖突,由調(diào)用者傳進(jìn)來(lái)
);
bExist = GetLastError() == ERROR_ALREADY_EXISTS;
// 創(chuàng)建一個(gè)文件映射的訪問(wèn)
lpMainWin = (PHANDLE)MapViewOfFile(
hMap, // 文件映射的句柄
FILE_MAP_ALL_ACCESS, // 訪問(wèn)權(quán)限,讀寫(xiě)都要,這個(gè)要和文件映射的權(quán)限兼容
0, // 偏移量的高位
0, // 偏移量的低位
4 // 要映射的字節(jié)數(shù)
);
if(lpMainWin == NULL)
bExist = false;
if(bExist)
{
if(!IsWindowVisible(*lpMainWin))
// 如果最小化狀態(tài)就將窗體恢復(fù)
PostMessage(*lpMainWin, WM_SYSCOMMAND, SC_RESTORE, 0);
// 窗體置前
SetForegroundWindow(*lpMainWin);
BringWindowToTop(*lpMainWin);
UnmapViewOfFile(lpMainWin);
return 0;
}
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
*lpMainWin = Application->MainForm->Handle;
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
// 關(guān)閉映射的訪問(wèn)
UnmapViewOfFile(lpMainWin);
return 0;
}
posted on 2008-01-31 15:13
七星重劍 閱讀(737)
評(píng)論(2) 編輯 收藏 引用 所屬分類:
PL--c/c++ 、
IDE -- c++ builder