//-------------------------------------------------------------------------------- // //【多重起動を防止する】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// char szInstance[] = {"MyInstance"} ; // このアプリケーション固有の文字列 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg ; // OpenMutex では、二重起動することがあるので、いきなりクリエイトする HANDLE hMutex = CreateMutex(MUTEX_ALL_ACCESS, FALSE, szInstance) ; if(::GetLastError() == ERROR_ALREADY_EXISTS){ // 既に起動している CloseHandle(hMutex) ; return FALSE ; } // ウィンドウの作成 : : // メッセージループ while(GetMessage(&msg, NULL, 0, 0)){ TranslateMessage(&msg) ; DispatchMessage(&msg) ; } // 作成したMutexの開放 ReleaseMutex(hMutex) ; CloseHandle(hMutex) ; return (msg.wParam) ; } // (MFC) ///////////////////////////////////////////////////////////////////////////// char szInstance[] = {"MyInstance"} ; // このアプリケーション固有の文字列 BOOL CTestApp::InitInstance() { : : // OpenMutex では、二重起動することがあるので、いきなりクリエイトする // m_hMutexはCTestAppクラスのHANDLE型メンバ変数として登録しておく m_hMutex = CreateMutex(FALSE, 0, szInstance) ; if(::GetLastError() == ERROR_ALREADY_EXISTS){ // 既に起動している CloseHandle(m_hMutex) ; return FALSE ; } : : return TRUE ; } ///////////////////////////////////////////////////////////////////////////// // クラスウィザードで追加されたExitInstance()関数 int CTestApp::ExitInstance() { // 作成したMutexの開放 ReleaseMutex(m_hMutex) ; CloseHandle(m_hMutex) ; return CWinApp::ExitInstance(); }
//-------------------------------------------------------------------------------- // //【CreateProcessの使い方】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// // プロセスの起動 BOOL Execute(LPTSTR lpCommandLine) { STARTUPINFO si ; PROCESS_INFORMATION pi ; if(CreateProcess(NULL, lpCommandLine, // コマンドライン文字列 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi){ // PROCESS_INFORMATION 構造体に返るハンドルは開放されないので // 呼び出し側が開放しなければならない CloseHandle(pi.hThread) ; CloseHandle(pi.hProcess) ; return TRUE ; } return FALSE ; }
//-------------------------------------------------------------------------------- // //【起動したアプリケーションの終了を待つ】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// // プロセスの起動(終了待ち有り) BOOL Execute(LPTSTR lpCommandLine) { STARTUPINFO si ; PROCESS_INFORMATION pi ; ZeroMemory(&si, sizeof(STARTUPINFO)) ; si.cb = sizeof(STARTUPINFO) ; si.dwFlags = STARTF_USESHOWWINDOW ; si.wShowWindow = SW_SHOWNORMAL ; if(CreateProcess(NULL, lpCommandLine, // コマンドライン文字列 NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){ // スレッドハンドルは使わないので即座に開放 CloseHandle(pi.hThread) ; // 起動したプロセスの終了を待つ WaitForSingleObject(pi.hProcess, INFINITE) ; // プロセスハンドルを開放 CloseHandle(pi.hProcess) ; MessageBox(NULL, "終了", "", MB_OK) ; return TRUE ; } return FALSE ; }
//-------------------------------------------------------------------------------- // //【関連付けられたアプリケーション名の取得】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// { char szExeFilePath[MAX_PATH] ; // 調べたいファイル名 char szFileName[] = {"Test.htm"} ; // 拡張子に対応した実行ファイル名の取得 FindExecutable(szFileName, NULL, szExeFilePath) ; MessageBox(hWnd, szExeFilePath, szFileName, MB_OK) ; }
//-------------------------------------------------------------------------------- // //【拡張子を指定して起動】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// // 拡張子を指定して起動 BOOL DataExecute(LPCTSTR lpszFileName) { HINSTANCE hInst = ShellExecute(NULL, "open", lpszFileName, NULL, NULL, SW_SHOWNORMAL) ; if(hInst < (HINSTANCE)32){ // 32未満の時は起動に失敗 return FALSE ; } // 成功時はhInstにアプリケーションのインスタンスハンドルが入る return TRUE ; }
//-------------------------------------------------------------------------------- // //【URLを指定してブラウザを起動】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// { HINSTANCE hInst = ShellExecute(NULL, "open", "開きたいURL", NULL, NULL, SW_SHOWNORMAL) ; if(hInst < (HINSTANCE)32){ // 32未満の時は起動に失敗 } }
//-------------------------------------------------------------------------------- // //【スクリーンセーバーの起動方法】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// // スクリーンセーバーの起動 void StartScreenSaver(HWND hWnd) // hWnd:起動する親ウィンドウハンドル { BOOL bActive = FALSE ; // スクリーンセーバーがコントロールパネルで設定されているかチェックする if(SystemParametersInfo(SPI_GETSCREENSAVEACTIVE, 0, &bActive, SPIF_UPDATEINIFILE) == TRUE){ if(bActive == TRUE){ //スクリーンセーバーの起動 SendMessage(hWnd, WM_SYSCOMMAND, SC_SCREENSAVE, 0) ; } } }
//-------------------------------------------------------------------------------- // //【スクリーンセーバーを止める】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// // スクリーンセーバーを止める void StopScreenSaver() { OSVERSIONINFO osInfo ; osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO) ; GetVersionEx(&osInfo) ; if(osInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS){ // Windows95 HWND hWnd = FindWindow("WindowsScreenSaverClass", NULL) ; if(hWnd != NULL) PostMessage(hWnd, WM_CLOSE, 0, 0L) ; } else if(osInfo.dwPlatformId == VER_PLATFORM_WIN32_NT){ // WindowsNT HDESK hDesk ; hDesk = OpenDesktop("Screen-saver", 0, FALSE, DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS) ; if (hDesk){ EnumDesktopWindows(hDesk, StopScreenSaverProc, 0) ; CloseDesktop(hDesk) ; } } } ///////////////////////////////////////////////////////////////////////////// // コールバック関数 BOOL CALLBACK StopScreenSaverProc(HWND hWnd, LPARAM lParam) { PostMessage(hWnd, WM_CLOSE, 0, 0L) ; SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, 0, SPIF_SENDWININICHANGE) ; return TRUE ; }
//-------------------------------------------------------------------------------- // //【電源を切れる状態にする】 // { /**/ MSG msg ; while(1){ // シャットダウン処理 long ret = ShutdownJob(EWX_SHUTDOWN) ; if(ret){ break ; } // Windowsメッセージがある場合 while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){ // Windowsメッセージを別タスクに処理させる ::DispatchMessage(&msg) ; } } PostQuitMessage(0) ; return 0L ; } // //【シャットダウン処理】 // long CBatchWasherDlg::ShutdownJob( long uFlag ) { HANDLE hToken ; TOKEN_PRIVILEGES tkp ; // プロセスに関連づけられたアクセストークンをオープン if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)){ return(FALSE) ; } // 指定されたシステムで指定された特権名を示すために使われる // ローカルに一意な識別子(LUID)を取得 if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)){ return(FALSE) ; } // トークン内の特権数 tkp.PrivilegeCount = 1 ; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED ; // 指定されたアクセストークンの特権を調整 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0) ; if (GetLastError() != ERROR_SUCCESS){ return(FALSE) ; } /* システムをシャットダウン */ return(ExitWindowsEx(uFlag | EWX_FORCE, 0)) ; }