ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 通过SDK函数实现WIN32应用程序的唯一实例。 (转)

通过SDK函数实现WIN32应用程序的唯一实例。 (转)

原创 Linux操作系统 作者:worldblog 时间:2007-12-10 09:46:30 0 删除 编辑
通过SDK函数实现WIN32应用程序的唯一实例。 (转)[@more@]

//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;
}

 

 


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-990814/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    6241
  • 访问量
    2405190