透過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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Win32 SDK封閉例項——普通的Windows程式(翻譯) (轉)Win32Windows
- Excel函式應用例項:計算保險收益(轉)Excel函式
- Win32 SDK登錄檔操作函式——RegQueryValue (轉)Win32函式
- Excel函式應用例項:折舊值計算(轉)Excel函式
- Excel函式應用例項:計算客流均衡度(轉)Excel函式
- Excel函式應用例項:銷售額預測(轉)Excel函式
- Excel函式應用例項:職工資訊查詢(轉)Excel函式
- Excel函式應用例項:位次閾值統計(轉)Excel函式
- js模擬實現replaceAll()函式程式碼例項JS函式
- 機器學習 - 似然函式:概念、應用與程式碼例項機器學習函式
- jQuery實現的JSONP應用程式碼例項jQueryJSON
- Excel函式應用例項:計算授課天數(轉)Excel函式
- Excel函式應用例項:自動錄入性別(轉)Excel函式
- Excel函式應用例項:職工年齡統計(轉)Excel函式
- js實現開啟應用程式程式碼例項JS
- javascript使用call()函式實現繼承程式碼例項JavaScript函式繼承
- Excel函式應用例項:計算貸款月償還額(轉)Excel函式
- Excel函式應用例項:計算員工應繳所得稅(轉)Excel函式
- Hive 分析函式lead、lag例項應用Hive函式
- ASP 中 Split 函式的例項 (轉)函式
- ajax應用實現iframe高度自適應程式碼例項
- Excel函式應用例項:自動錄入出生日期(轉)Excel函式
- Excel函式應用例項:按性別統計職工數(轉)Excel函式
- hasOwnProperty()函式程式碼例項函式
- 再談應用程式的例項問題 (轉)
- 透過Span實現高效能陣列,例項解析陣列
- shell裡邊子函式與主函式的例項(轉)函式
- Excel函式應用例項:計算零存整取未來值(轉)Excel函式
- js函式作為函式的引數程式碼例項JS函式
- Win32 API CreateCompatibleDC 函式的相關應用Win32API函式
- jquery的filter()函式用法程式碼例項jQueryFilter函式
- javascript實現網頁跳轉的程式碼例項JavaScript網頁
- vfork函式例項函式
- jQuery css()函式使用程式碼例項jQueryCSS函式
- js冪函式程式碼例項分享JS函式
- 透過例子學習Lua(4)--函式的呼叫(轉)函式
- 透過列舉enum實現單例單例
- localStorage應用程式碼例項