Sample5

[プロセス系]



//--------------------------------------------------------------------------------
//
//【多重起動を防止する】
//
//(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)) ;
}