original addressccrun(老妖)提供的
一、通過創建互斥量來判斷:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
HANDLE hMutex = CreateMutex(NULL, TRUE, "MyAppMutex");
if(NULL == hMutex)
{
MessageBox(NULL, "創建Mutex失敗!",
Application->Title.c_str(), MB_OK | MB_SYSTEMMODAL);
return 0;
}
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
::MessageBox(NULL, "已經運行了一個實例!",
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;
}
二、用系統原子
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
const char *Atom = "SingleApp";
try
{
if (GlobalFindAtom(Atom) != 0) // 在系統原子表中找原子
{
::MessageBox(NULL, "已經運行了一個實例!",
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;
}
三、通過FindWindow函數來判斷:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
HWND hForm = FindWindow("TForm1", "Form1");
if(NULL != hForm)
{
::MessageBox(NULL, "已經運行了一個實例!",
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;
}
四、通過內存映射來還原窗口:
PHANDLE lpMainWin;
HANDLE hMap;
bool bExist;
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
hMap = CreateFileMapping(
(HANDLE)0xFFFFFFFF, // 要映射的文件名,使用0xFFFFFFFF是說明不使用真實文件,而是在頁面文件上創建內存
NULL, // 安全屬性
PAGE_READWRITE, // 訪問權限,讀寫都要
0, // 最大內存的高位
4, // 最大內存的低位,最大內存有4字節就夠了,只需要放一個窗體的句柄
"MyProjectFlag" // 映射名字,這個應該是本程序獨有的,和其他程序不沖突,由調用者傳進來
);
bExist = GetLastError() == ERROR_ALREADY_EXISTS;
// 創建一個文件映射的訪問
lpMainWin = (PHANDLE)MapViewOfFile(
hMap, // 文件映射的句柄
FILE_MAP_ALL_ACCESS, // 訪問權限,讀寫都要,這個要和文件映射的權限兼容
0, // 偏移量的高位
0, // 偏移量的低位
4 // 要映射的字節數
);
if(lpMainWin == NULL)
bExist = false;
if(bExist)
{
if(!IsWindowVisible(*lpMainWin))
// 如果最小化狀態就將窗體恢復
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);
}
}
// 關閉映射的訪問
UnmapViewOfFile(lpMainWin);
return 0;
}
posted on 2008-01-31 15:13
七星重劍 閱讀(738)
評論(2) 編輯 收藏 引用 所屬分類:
PL--c/c++ 、
IDE -- c++ builder