多重起動、抑制
#include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); #define PROC_NAME _T("ProcSample06") //---------------------------------------------------------------- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPreInst, LPWSTR lpszCmdLine, int nCmdShow ) { HWND hwnd; MSG msg; WNDCLASS myProg; //------------------------------ if (!hPreInst) { myProg.style = CS_HREDRAW | CS_VREDRAW; myProg.lpfnWndProc = WndProc; myProg.cbClsExtra = 0; myProg.cbWndExtra = 0; myProg.hInstance = hInstance; myProg.hIcon = NULL; myProg.hCursor = NULL; myProg.hbrBackground = (HBRUSH)COLOR_WINDOW; myProg.lpszMenuName = NULL; myProg.lpszClassName = PROC_NAME; if (!RegisterClass( &myProg )){ return FALSE; } } hwnd = FindWindow( PROC_NAME, NULL ); if( hwnd != 0 ){ SetForegroundWindow( hwnd ); return FALSE; } hwnd = CreateWindow( PROC_NAME, L"Sample06", WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); do{ if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE )) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } while(msg.message != WM_QUIT); return (int)( msg.wParam ); } //---------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { HDC hdc; PAINTSTRUCT paintSt; switch (msg) { case WM_PAINT: hdc = BeginPaint( hwnd, &paintSt ); EndPaint( hwnd, &paintSt ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return(DefWindowProc( hwnd, msg, wParam, lParam )); } return (0L); }
■いつものプログラムにこれを足しました。
多重起動が確認されたとき、すでに立ち上がっているプログラムを前面に持っていき自分は終了します。
WindowsMobileではこんな感じでいいかな
hwnd = FindWindow( PROC_NAME, NULL ); if( hwnd != 0 ){ SetForegroundWindow( hwnd ); return FALSE; }
■ほかにも、多重起動をチェックする方法は
のようなやりかたとか、いろいろあるので、自分の好きなやりかたで
HANDLE hMutex; hMutex = CreateMutex(NULL, TRUE, PROC_NAME ); if (!hMutex) return FALSE; if (GetLastError() == ERROR_ALREADY_EXISTS){ ReleaseMutex( hMutex ); return FALSE; } //------------------------------ hwnd = CreateWindow( PROC_NAME, L"Sample06", WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); do{ if(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE )) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } while(msg.message != WM_QUIT); ReleaseMutex( hMutex ); CloseHandle( hMutex ); return (int)( msg.wParam }