透過SDK函式實現WIN32應用程式的唯一例項。 (轉)
//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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hive 分析函式lead、lag例項應用Hive函式
- Win32 API CreateCompatibleDC 函式的相關應用Win32API函式
- 機器學習 - 似然函式:概念、應用與程式碼例項機器學習函式
- 透過Span實現高效能陣列,例項解析陣列
- WebAssembly實踐指南——C++和Rust透過wasmtime實現相互呼叫例項WebC++RustASM
- 透過 Radius 實現Dapr 雲原生應用程式開發協作
- 響應式佈局程式碼例項
- Gartner預測:5年5億新應用,65%應用程式將透過低程式碼實現!
- 在Cucumber中應用 PicoContainer容器實現元件的例項化AI元件
- 透過鉤子函式+Traceid實現Flask鏈路追蹤函式Flask
- ”innerHTML“的應用例項HTML
- 手寫 PromiseA+ 實現,輕鬆透過 872 條用例Promise
- 用listagg函式分組實現列轉行函式
- 遞迴函式例項大全遞迴函式
- 008 透過連結串列學習Rust之實現Peek函式Rust函式
- js實現函式過載JS函式
- dd應用例項
- 透過程式碼例項簡單瞭解Python sys模組Python
- 字元如何透過函式成為html實體字元函式HTML
- android開發透過wireshark實現flutter應用抓包AndroidFlutter
- 例項物件和函式物件的區別物件函式
- 私有建構函式的物件建立例項函式物件
- python例項建立銷燬的函式整理Python函式
- Vue 原始碼解析(例項化前) - 響應式資料的實現原理Vue原始碼
- Vue 原始碼解析(例項化前) – 響應式資料的實現原理Vue原始碼
- python 單一程式例項 實現Python
- python中實現函式過載Python函式
- PHP中實現函式過載PHP函式
- 驅動開發:透過應用堆實現多次通訊
- UWP 透過 .NET 9 和Native AOT 的支援實現 UWP 應用的現代化
- PHP preg match正規表示式函式的操作例項PHP函式
- 013 透過連結串列學習Rust之實現連結串列的通用函式Rust函式
- Python中compile函式的語法及例項!PythonCompile函式
- 用函式實現模組化程式設計二函式程式設計
- 用函式實現模組化程式設計三函式程式設計
- 用函式實現模組化程式設計一函式程式設計
- 唯一標識 Java 執行的例項Java
- html實現簡單ListViews效果的例項程式碼HTMLView
- MYSQL: 表表示式(CTE)實現遞迴例項MySql遞迴