ウインドウの二重起動を防止する(C/C++版)
ウインドウの二重起動を防止するサンプルです。
サンプルの実行画面
ソースコード
[Sample19.c]
//-------------------------------------------------------------------------------------- // ■ウインドウの二重起動を防止する■ Sample NO.19 // //-------------------------------------------------------------------------------------- #include <windows.h> HANDLE hMutex = NULL; //コールバックプロシージャ LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); //------------------------------------------------------ //■関数 ScreenCenterX(ローカル) //■用途 ウインドウを中央にする為にX座標(LEFT)を算出する //■引数 // Width ...ウインドウの横幅 //------------------------------------------------------ int ScreenCenterX(int Width) { int X; X = (GetSystemMetrics(SM_CXSCREEN)- Width) / 2; if (X<0) X=0; return(X); } //------------------------------------------------------ //■関数 ScreenCenterY(ローカル) //■用途 ウインドウを中央にする為にY座標(TOP)を算出する //■引数 // Height ...ウインドウの縦幅 //------------------------------------------------------ int ScreenCenterY(int Height) { int Y; Y= (GetSystemMetrics(SM_CYSCREEN)- Height) / 2; if (Y<0) Y=0; return(Y); } //------------------------------------------------------ //■関数 CreateMainWindow(ローカル) //■用途 メインウインドウを作成する //■引数 // Width ...ウインドウの横幅 // Height ...ウインドウの縦幅 // Caption ...タイトル名 // hInstance ...インスタンスハンドル // nCmdShow ...ウインドウの表示形態 // lpfnWndProc...コールバックプロシージャ // dwstyle ...ウインドウスタイル // dwExstyle ...拡張ウインドウスタイル // MenuID ...メニューのID // hIcon ...アイコン //■戻り値 // ウインドウのハンドル //------------------------------------------------------ HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon) { HWND hWnd; //メインウインドウのハンドル WNDCLASS myClass; //WNDCLASS構造体 //WNDCLASS構造体を0で初期化 ZeroMemory(&myClass,sizeof(WNDCLASS)); //--->WNDCLASS構造体の設定&ウインドウクラスの登録 //ウインドウスタイルを設定 myClass.style =CS_HREDRAW | CS_VREDRAW; //コールバックプロシージャへのポインタ myClass.lpfnWndProc = lpfnWndProc; //インスタンスハンドルを設定 myClass.hInstance =hInstance; //カーソルの設定(Windows標準リソースを使用) myClass.hCursor =LoadCursor(NULL, IDC_ARROW); //ウインドウの背景を設定(デフォルトカラー) myClass.hbrBackground =(HBRUSH)COLOR_WINDOW; //クラス名の設定(Borland Delphi風) myClass.lpszClassName ="TForm"; //アイコンの指定 myClass.hIcon =hIcon; //メニューの設定 myClass.lpszMenuName=MenuID; //ウィンドウ クラスを登録 RegisterClass(&myClass); //--->ウインドウの作成&表示 //メインウインドウの生成 hWnd = CreateWindowEx( //拡張ウインドウスタイル dwExstyle, //登録されたクラス名のアドレス "TForm", //ウインドウ名 Caption, //ウインドウスタイルを設定 dwstyle, //X座標の位置設定 ScreenCenterX(Width), //Y座標の位置設定 ScreenCenterY(Height), //横幅を設定 Width, //縦幅を設定 Height, //親ウインドウを設定 NULL, //メニューを設定 NULL, //インスタンスを識別 hInstance, //作成したウインドウに渡すデータへのポインタ NULL); //ウインドウの表示(表示方法はnCmdShowに従う) ShowWindow(hWnd, nCmdShow); return(hWnd); } //-------------------------------------------------------- //■関数 WinMain //■用途 メインの関数 //■引数 // hInstance ...現在のインスタンスのハンドル // hPrevInstance...以前のインスタンスのハンドル // pszCmdLine ...コマンド ラインのアドレス // nCmdShow ...ウィンドウの表示状態 //-------------------------------------------------------- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; //ミューッテックスオブジェクトを作成する hMutex = CreateMutex(NULL, TRUE, "あいうえお"); //既に作成していたら終了 if(GetLastError() == ERROR_ALREADY_EXISTS ) return FALSE; //メインウインドウを作成 CreateMainWindow(280,230,"ウインドウの二重起動を防止する",hInstance,nCmdShow,(WNDPROC)WindowProc, WS_OVERLAPPEDWINDOW,WS_EX_CONTROLPARENT | WS_EX_WINDOWEDGE,NULL,LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION))); //送られてくるメッセージを翻訳してプロシージャに渡す while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (msg.wParam); } //------------------------------------------------------ // ■関数 WindowProc // ■用途 メインウインドウに送られるメッセージを処理 // ■引数 // hwnd ...ウインドウのハンドル // uMsg ...メッセージID // wParam ...第1メッセージ パラメータ // lParam ...第2メッセージ パラメータ //------------------------------------------------------ LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_DESTROY: //ミューテックスオブジェクトの開放 ReleaseMutex(hMutex); CloseHandle(hMutex); PostQuitMessage(0); break; //その他のメッセージはWindowsに任せる default:return(DefWindowProc(hwnd, uMsg, wParam, lParam)); } return (0); }
ソースコード一式のダウンロード
capi_sample19.zip 2,218 バイト
動作環境
このサンプルは 「Windows98」及び「Microsoft Visual C++5.0」「Borland C++ Compiler 5.5」で確認しております。環境が異なる場合は正常に動作しない場合もございますのでご了承下さい。
Visual C++5.0でのコンパイル
VC5.0でサンプルをコンパイルする場合は新規プロジェクト(Win32Application)を作成後、各ファイルを追加してビルドしてください。
Borland C++ Compiler 5.5でのコンパイル
BCC5.5でサンプルをコンパイルする場合は「bcc32.exe」で*.c又は*.cppファイルをコンパイルします。リソースがある場合は「brc32.exe」で*resファイルを付与してください。
サンプルについて
このWindows APIサンプル集(C/C++版)は2000年頃にC/C++言語の学習の為に作成したものです。コードはエレガントではなく「初心者レベルのコーディング」です。仕事などの業務で利用する際にはエラー処理やメモリ解放などの再確認を必ずして下さい。
スポンサーリンク
関連記事
公開日:2015年03月19日
記事NO:00475