在网上很多朋友都有这方面的问题,根据以前的方法是使用FindWindow但是使用MFC后开发者无法指定Window Class Name,特别是在Win32环境下,有更多更好的方法可以实现这一要求。如使用File Map,有名互斥量,有名事件量等都可以做到。
下面介绍使用有名互斥量的用法:
class CSingleInstance
{
public:
CSingleInstance();
~CSingleInstance();
BOOL Create(LPCSTR pszClass);
CString GetClassName( void ) const;
protected:
HANDLE m_hMutex;
CString m_strClassName;
};
CSingleInstance::CSingleInstance()
{
// Set our default values
m_hMutex = NULL;
}
CSingleInstance::~CSingleInstance()
{
if ( m_hMutex != NULL ) {
ReleaseMutex( m_hMutex );
}
}
BOOL CSingleInstance::Create(LPCSTR pszClassName)
{
// Add the word 'Class' to the end
m_strClassName = pszClassName;
// Create the mutex
m_hMutex = CreateMutex( NULL, FALSE, m_strClassName );
// Check for errors
if ( GetLastError() == ERROR_ALREADY_EXISTS ) {
// Reset our mutext handle (just in case)
m_hMutex = NULL;
// The mutex already exists, which means an instance is already
// running. Find the app and pop it up
HWND hWnd = FindWindowEx( NULL, NULL, m_strClassName, NULL );
if ( hWnd != NULL ) {
ShowWindow(hWnd,SW_SHOW);
ShowWindow( hWnd, SW_RESTORE );
BringWindowToTop( hWnd );
SetForegroundWindow( hWnd );
}
// Return failure
return FALSE;
}
// Return success
return TRUE;
}
CString CSingleInstance::GetClassName( void ) const
{
return m_strClassName;
}
在Create中我使用了FindWindow来找出已经存在的窗口句柄,当然这不是必要的。你可以根据自己的需要去掉这写代码。
使用说明:
BOOL CXXXApp::InitInstance(....)
{//m_ss 为成员变量
if(!m_ss.Create("my class name"))
return FALSE;
........
}