透過SDK函式實現WIN32應用程式的唯一例項。 (轉)

worldblog發表於2007-12-10
透過SDK函式實現WIN32應用程式的唯一例項。 (轉)[@more@]

//FORMMAIN.CPP

#include <.h>
#include "ExeMutex.h"

static LPCSTR szAppName = TEXT("HelloWin") ;

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

 


int WIN 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) GetStock (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 ActiveOp( 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;
}

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990814/,如需轉載,請註明出處,否則將追究法律責任。

相關文章