怎样使程序只运行一个实例,并且当用户打开文件产生程序实例时自动用本程序的第一个实例打开
怎样使程序只运行一个实例,并且当用户打开文件产生程序实例时自动用本程序的第一个实例打开 问题点数:60、回复次数:6Top
1 楼alaisalaix(天上人间)回复于 2005-05-31 01:30:52 得分 10
方法一:
在IninInstance()函数加入如下代码:
HANDLE hObject = CreateMutex(NULL,FALSE,"SingleInstance");
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hObject);
AfxMessageBox("程序已经运行!");
return FALSE;
}
Top
2 楼alaisalaix(天上人间)回复于 2005-05-31 01:34:16 得分 20
方法二,使用编译器来实现,较复杂一点
使用#pragma data_seg编译指令,共享一个全局变量
总之,要实现一个程序实例,需要采用互斥机制Top
3 楼wormwwww(大虫)回复于 2005-05-31 06:30:06 得分 5
在App文件里加:
例如:
BOOL CWatchApp::InitInstance()
{
.
.
.
HWND oldHWnd = NULL;
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚举所有运行的窗口
if(oldHWnd != NULL)
{
::ShowWindow(oldHWnd,3); //激活找到的前一个程序
::SetForegroundWindow(oldHWnd); //把它设为前景窗口
return false; //退出本次运行
}
.
.
.
SetProp(theApp.GetMainWnd()->m_hWnd,g_szPropName,g_hValue);//设置唯一属性
.
.
.
}Top
4 楼wormwwww(大虫)回复于 2005-05-31 06:30:54 得分 0
alaisalaix(流水落花春去也,天上人间)说得很对,就是互斥!Top
5 楼younggle(洋溢)回复于 2005-05-31 09:03:10 得分 25
下面可以满足你的需求:
#define APPLICATION_TITLE "你应用程序的窗口标题"
static HANDLE g_RunningMutex = NULL;
BOOL CXXXXXApp::InitInstance()
{
//只运行一个实例
g_RunningMutex = CreateMutex(NULL, TRUE, _T(APPLICATION_TITLE));
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
HWND hWnd = FindWindow(NULL, APPLICATION_TITLE);
if(hWnd != NULL)
{
ShowWindow(hWnd,SW_MAXIMIZE);
SetForegroundWindow(hWnd);
BringWindowToTop(hWnd);
}
else
{
CString strMessage("");
strMessage.Format("%s 已经在运行!", APPLICATION_TITLE);
::MessageBox(NULL, strMessage, "提示", MB_OK|MB_ICONEXCLAMATION);
}
if( NULL != g_RunningMutex )
{
CloseHandle(g_RunningMutex);
g_RunningMutex = NULL;
}
return FALSE;
}
.........................
}
int CXXXXXApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if(g_RunningMutex != NULL)
{
CloseHandle(g_RunningMutex);
g_RunningMutex = NULL;
}
return CWinApp::ExitInstance();
}Top
6 楼wfy023640()回复于 2005-05-31 13:20:48 得分 0
多谢各位Top




