壹個簡單的辦法就是用應用程序的執行文件名創建互斥對象(mutex object)(API為CreateMutex),這樣,每次在程序開始執行的時候,若創建失敗,則表示該應用程序正在運行中,通過遍歷操作系統的所有運行程序,並比較它們的屬性,找到正在運行的窗口,激活它。否則,表示該應用程序在之前沒有運行副本,於是就正常啟動並運行該程序就可以了。
關鍵API:
CreateMutex()
SetProp()
GetProp()
可以通過幫助文檔了解以上API的說明
以下給妳壹段VC++中BOOL CXXXApp::InitInstance()的相關代碼(返回FALSE表示應用程序退出):
//m_pszExeName為應用程序的執行文件名
::CreateMutex(NULL, TRUE, m_pszExeName);
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
//Find previous application's main window
CWnd* pPrevWnd = CWnd::GetDesktopWindow()->GetWindow(GW_CHILD);
while(pPrevWnd)
{
//Does this window have the previous instance tag set?
if(::GetProp(pPrevWnd->GetSafeHwnd(),m_pszExeName))
{
//Found window, set focus to the window
//First restore window if it is currently iconic.
if(pPrevWnd->IsIconic())
pPrevWnd->ShowWindow(SW_RESTORE);
//Set focus to main window
pPrevWnd->SetForegroundWindow();
//If window has a pop-up window, set focus to pop-up.
pPrevWnd->GetLastActivePopup()->SetForegroundWindow();
//找到了原先的應用程序主窗口pPreWnd,就可以把啟動本程序時的參數
//或者其它數據傳遞給pPreWnd,然後交由pPreWnd處理就可以了
//========>>>>>估計妳關心的問題關鍵就在這裏<<<<<========
return FALSE;
}
//Did not find window, get next window in list.
pPrevWnd = pPrevWnd->GetWindow(GW_HWNDNEXT);
}
TRACE("Could not find previous instance main window!\n");
return FALSE;
}
//創建主窗口
CMainFrame* pMainFrame = new CMainFrame;
m_pMainWnd = pMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
// The main window has been initialized, so show and update it.
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
//Associate a tag with the window so we can locate it later.
::SetProp(pMainFrame->GetSafeHwnd(),m_pszExeName,(HANDLE)1);
//沒有找到,繼續做該做的事兒...
//...
補充:
1。查找原先運行的應用程序時,用應用程序的執行文件名更好些,因為窗口標題可能會在程序運行期間發生變化
2。只要能得到原先應用程序的窗口實例(如窗口指針或者句柄),就可以把數據或消息發送給它
3。剛才沒有看見妳用的是VB(估計是在我寫以上文字時加上的),特意寫了段VC的代碼(辛苦啊),其實不管是vc還是vb,原理是壹樣的,就不再重復寫壹遍了,諒解哦!