不可重复执行程序的实现

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在网上很多朋友都有这方面的问题,根据以前的方法是使用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;

........

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航