//FORMMAIN.CPP
#include <windows.h>
#include "ExeMutex.h"
static LPCSTR szAppName = TEXT("HelloWin") ;
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
if(!OperateMutex(szAppName,szAppName,szAppName,OPEN))
{return FALSE;}
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
RegisterClass(&wndclass);
hwnd = CreateWindow (szAppName, // window class name
szAppName, // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return 0 ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
OperateMutex(szAppName,szAppName,szAppName,CLOSE);
PostQuitMessage (0);
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
//头文件
/* 定义用于判断操作类型的常量 */
const bool OPEN = 1;
const bool CLOSE = 0;
//函数声明
BOOL OperateMutex(LPCSTR,LPCTSTR,LPCTSTR,BOOL);
BOOL ActiveOldApp( LPCSTR,LPCSTR);
//判断当前应用程序运行实例是否存在的函数体
BOOL OperateMutex( LPCSTR InstanceName, //自定义用于表示应用程序的唯一标识名
LPCSTR hWndClassName, //窗体的注册类名 CreateWindow 函数中指定
LPCSTR hWndWinName, //窗体名 CreateWindow 函数中指定
BOOL mOperate) //操作判断变量
{
HANDLE hMutex;
hMutex = OpenMutex(MUTEX_ALL_ACCESS,FALSE,InstanceName);
switch(mOperate)
{
case OPEN: //OPEN = 启动程序
if(hMutex==NULL)
{
hMutex = CreateMutex(NULL,FALSE,InstanceName);
if( (hMutex == NULL) || (GetLastError()==ERROR_ALREADY_EXISTS))
{
ActiveOldApp(hWndClassName,hWndWinName);
return FALSE; //程序已经启动或有错误发生
}
else
{ return TRUE; } //第一次启动程序
}
else
{ ActiveOldApp(hWndClassName,hWndWinName);
return FALSE; //程序已经启动
}
break;
case CLOSE: //CLOSE = 退出程序
ReleaseMutex(hMutex);
CloseHandle(hMutex);
break;
}
return TRUE;
}
// 激活已启动的程序
BOOL ActiveOldApp( LPCSTR hWndClassName, //窗体的注册类名 CreateWindow 函数中指定
LPCSTR hWndWinName) //窗体名 CreateWindow 函数中指定
{
HWND hWndApp,hWndPopup;
if (hWndApp = FindWindow(hWndClassName,hWndWinName))
{
hWndPopup = GetLastActivePopup(hWndApp);
BringWindowToTop(hWndApp);
if ( IsIconic(hWndPopup) )
{ ShowWindow(hWndPopup, SW_RESTORE); }
else
{ SetForegroundWindow(hWndPopup); }
}
else
{
return FALSE;
}
return TRUE;
}