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

原创 2001年09月13日 17:16:00

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

 

 

我为什么选择Win32SDK以及Win32SDK的特点

玩Win32SDK已有一段时间内,从初中的时候就开始了,虽然时间紧,就假期里或插空背着父母玩会,但是两三年下来,收获也是不浅。所以就想着把我学的东西都整理下来,算是纪念吧,如果还能帮助一下别人,也是我...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年06月02日 13:43
  • 2628

Win32 SDK基础(3)—— 从零开始创建windows窗口(一)

一、从Windows的程序分类说起。     从高中第一次接触电脑开始(惭愧,高中才会用电脑,大学一年级才知道有QQ这么个东西,家里穷,没办法),在我的概念中电脑应该就是windows这样的。所以,直...
  • lzhui1987
  • lzhui1987
  • 2016年12月03日 21:24
  • 4045

WIN32 SDK 创建一个窗体的过程

一.窗口的创建过程 1.设计窗口类 2.注册窗口类 3.创建窗口 4.显示窗口   #include   //回调函数声明 LRESULT CALLBACK MyProc( HWND hwnd, ...
  • kaishang0713
  • kaishang0713
  • 2013年11月24日 20:38
  • 1041

Win32程序入口函数

每一个Win32程序都有一个入口函数,一般来说入口函数的名字是WinMain。 在大多数的Win32程序中,WinMain函数要为应用程序完成以下几个步骤:       1.注册窗口类     ...
  • qq_19995883
  • qq_19995883
  • 2016年11月27日 09:38
  • 238

VS2010 win32项目windows窗体程序 向导生成代码解析

Win32项目的windows窗体程序的向导生成了如下代码: // Timer.cpp : 定义应用程序的入口点。 // #include "stdafx.h" #include "Timer.h...
  • qq2399431200
  • qq2399431200
  • 2013年09月15日 20:55
  • 1988

应用程序每次只能运行一个实例(C#)

有时根据实际需要可能希望应用程序每次只有一个实例在运行,当再次点击同一个应用程序的可执行文件时并不生成一个新的实例,而是将相应的用户界面激活,显示在屏幕最前面。要解决这个问题主要是考虑如何判断应用程序...
  • CNHK1225
  • CNHK1225
  • 2015年01月14日 12:31
  • 890

[Win32SDK基本] 窗口详解(超详细)(续)(补充)

上次( [Win32SDK基本] 窗口详解(超详细)地址:http://blog.csdn.net/zuishikonghuan/article/details/46378475)忘了写窗口操作函数和...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年06月16日 13:47
  • 3805

win32 (SDK)文本输出

Windows 分三大部分,kernel ,GDI ,User 设备环境,设备环境句柄是应用程序使用GDI函数的通行证。跟显示设备和打印设备挂钩,实际就是一个数据结构。 方法一:   (相应...
  • u012997311
  • u012997311
  • 2016年11月19日 22:04
  • 516

Win32控制台应用程序、Win32项目、MFC应用程序的区别与联系

1、  区别 (1)Win32控制台程序,没有界面,只有命令符。生成的“.exe”文件直接运行操作即可。 (2)Win32项目,有界面。但是界面里面的控件,基本上要自己去实现。 (3)MFC应用...
  • zhao1999qian
  • zhao1999qian
  • 2017年02月25日 16:41
  • 3292

win32SDK中使用bmp和png位图

Win32SDK.h #pragma once #include #include #include #include #include #pragma comment(lib,"gdipl...
  • qq125096885
  • qq125096885
  • 2015年04月21日 10:50
  • 1012
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过SDK函数实现WIN32应用程序的唯一实例。
举报原因:
原因补充:

(最多只允许输入30个字)