📄 0516004.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title></title>
<link rel="stylesheet" type="text/css" href="../../vckbase.css">
</head>
<body>
<div align="justify">
<table border="0" width="100%" class="font" height="57">
<tr>
<td width="27%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">VC知识库(五)</font>
</td>
<td width="73%" height="6" class="bigfont" bgcolor="#B8CFE7" align="center" bordercolor="#800080">
<font color="#800080">www.vckbase.com</font>
</td>
</tr>
<tr>
<td width="100%" height="4" class="header" valign="top" align="center" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="17" class="header" valign="top" align="center" colspan="2">
<p align="center"><big><strong>不可重复执行程序的实现</strong></big></p>
</td>
</tr>
<tr>
<td width="100%" height="17" class="info" align="center" colspan="2">
<strong><big>闻怡洋 <a href="http://www.vchelp.com/">http://www.vchelp.com/</a>
<a href="mailto:wyy_cq@188.net">wyy_cq@188.net</a></big></strong>
</td>
</tr>
<tr>
<td width="100%" height="22" class="font" colspan="2">
<hr>
</td>
</tr>
<tr>
<td width="100%" height="5" class="font" colspan="2">
<p>在网上很多朋友都有这方面的问题,根据以前的方法是使用FindWindow但是使用MFC后开发者无法指定Window
Class Name,特别是在Win32环境下,有更多更好的方法可以实现这一要求。如使用File
Map,有名互斥量,有名事件量等都可以做到。</p>
<p>下面介绍使用有名互斥量的用法:</p>
<pre>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;
}
</pre>
<p>在Create中我使用了FindWindow来找出已经存在的窗口句柄,当然这不是必要的。你可以根据自己的需要去掉这写代码。</p>
<p>使用说明:</p>
<pre>BOOL CXXXApp::InitInstance(....)
{//m_ss 为成员变量
if(!m_ss.Create("my class name"))
return FALSE;
........</pre>
<pre>}</pre>
</td>
</tr>
<tr>
<td width="100%" height="12" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="6" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="8" class="font" colspan="2">
</td>
</tr>
<tr>
<td width="100%" height="17" class="font" colspan="2"></td>
</tr>
</table>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -