// delstart.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "delstart.h"

// 引数と戻り値
// bit0〜7 : (0〜255) : taskbarの透明度(Windows 2000/XP以上で有効)
// bit8   : (   256) : スタートボタンを閉じる場合は1
#define CLOSESTART	256
// bit9   : (   512) : スタートボタンを隠す場合は1
#define HIDDENSTART	512
// bit10  : (  1024) : スタートボタンをグレイアウトする場合は1
#define DISABLESTART 1024
// bit11  : (  2048) : タスクバーを隠す場合は1
#define HIDDENTASKBAR 2048
// bit12  : (  4096) : タスクバーをグレイアウトする場合は1
#define DISABLETASKBAR 4096
// bit13  : (  8192) : デスクトップを隠す場合は1
#define HIDDENDESKTOP 8192
// bit14  : ( 16384) : デスクトップを無効化する場合は1
#define DISABLEDESKTOP 16384

int APIENTRY WinMain(HINSTANCE, HINSTANCE, LPTSTR lpCmdLine, int)
{
	HWND hTaskBar, hStartButton, hDesktop;
	int  value = 0, i;
	OSVERSIONINFO ovi;

	// Windowsのバージョンを取得(Vista以降、スタートボタンのあり方が変わったため)
	ovi.dwOSVersionInfoSize = sizeof(ovi);
	GetVersionEx(&ovi);

	// デスクトップのウィンドウハンドルを得る
	if (NULL == (hStartButton = FindWindow("Progman", "Program Manager"))) {
		hDesktop = NULL; // ↑StartButtonをtmp変数として使っているだけ
	}
	else {
		hDesktop = FindWindowEx(hStartButton,NULL,"SHELLDLL_DefView",NULL);
	}

	// タスクバー・スタートボタン(WinXP以下)のウィンドウハンドルを得る
	if (NULL == (hTaskBar = FindWindow("Shell_TrayWnd", NULL))) {
		// タスクバーが存在しないということは、スタートボタンも存在しない
		hStartButton = NULL;
	}
	else {
		// スタートボタンの取得
		if ( ovi.dwMajorVersion < 6 ) {
			// (Windows XP以下の場合)
			hStartButton = FindWindowEx(hTaskBar, NULL, "Button", NULL);
		}
	}

	if ( ovi.dwMajorVersion >= 6 ) {
		// Windows Vista以降の場合のスタートボタンの取得
		// (スタートボタンは、タスクバーとは独立して、デスクトップに直接ボタンが置かれる)
		hStartButton = FindWindow("Button", NULL);
	}

	
	if ( lpCmdLine == NULL || lpCmdLine[0] == 0 ) {
		MessageBox( NULL, "このプログラムは「いじくるつくーる」(Rnsf7.exe)より間接的に呼び出されます。", "Delstart.exe", MB_OK | MB_ICONINFORMATION );
		return 1;
	}
	else if ( _stricmp(lpCmdLine, "getstatus") == 0 ) {
		; // 何もしない(読み出しのため)
	}
	else { // プログラムの引数がgetstatus以外だったら、各設定を行う
		value = atoi( lpCmdLine );

		// タスクバーに関連した設定
		if ( hTaskBar ) {
			// タスクバーの透明度の設定(Windows 2000/XP以降)
			SetExl( hTaskBar, (BYTE)(value&0xff) );

			// タスクバーを隠す/表示
			ShowWindow( hTaskBar, (value&HIDDENTASKBAR)?SW_HIDE:SW_SHOW );

			// タスクバーを無効化(グレイアウト)/有効化
			EnableWindow( hTaskBar, (value&DISABLETASKBAR)?FALSE:TRUE );
		}

		// デスクトップに関連した設定
		if ( hDesktop ) {
			// デスクトップを隠す/表示
			ShowWindow( hDesktop, (value&HIDDENDESKTOP)?SW_HIDE:SW_SHOW );

			// タスクバーを無効化(グレイアウト)/有効化
			EnableWindow( hDesktop, (value&DISABLEDESKTOP)?FALSE:TRUE );
		}

		// スタートボタンに関連した設定
		if ( hStartButton ) {
			// スタートボタンを隠す/表示
			ShowWindow( hStartButton, (value&HIDDENSTART)?SW_HIDE:SW_SHOW );

			// スタートボタンを無効化(グレイアウト)/有効化
			EnableWindow( hStartButton, (value&DISABLESTART)?FALSE:TRUE );

			// スタートボタンを閉じる
			if ( value&CLOSESTART ) {
				SendMessage(hStartButton, WM_CLOSE, 0, 0);
			}
		}
	}

	// プログラムの引数の有無にかかわらず、現在の状態を返却する
	value = 0;

	// タスクバーの状態を取得
	if ( hTaskBar ) {
		i = GetExl( hTaskBar );
		if ( i == -1 ) { // Windows XPでないと、現在の透明度は得られない
			value = 255; // エラーでもとりあえず255を返しておけば、不具合の発生は最低に抑えられるだろうという思惑
		}
		else {
			value = i;
		}

		// タスクバーの表示状態を得る
		if ( !IsWindowVisible( hTaskBar ) ) {
			value |= HIDDENTASKBAR;
		}
		
		// タスクバーの有効・無効状態を得る
		if ( !IsWindowEnabled( hTaskBar ) ) {
			value |= DISABLETASKBAR;
		}
	}

	// デスクトップの状態を取得
	if ( hDesktop ) {
		// デスクトップの表示状態を得る
		if ( !IsWindowVisible( hDesktop ) ) {
			value |= HIDDENDESKTOP;
		}
		
		// デスクトップの有効・無効状態を得る
		if ( !IsWindowEnabled( hDesktop ) ) {
			value |= DISABLEDESKTOP;
		}
	}

	// スタートボタンの状態を取得
	if ( hStartButton && IsWindow(hStartButton) ) {
		// スタートボタンの表示状態を得る
		// ShowWindowやIsWindowVisibleを使うと、hTaskBarの状態に左右されるので、ウィンドウスタイルを直接得る
		if ( !(GetWindowLongPtr(hStartButton, GWL_STYLE) & WS_VISIBLE) ) {
			value |= HIDDENSTART;
		}
		
		// スタートボタンの有効・無効状態を得る
		if ( !IsWindowEnabled( hStartButton ) ) {
			value |= DISABLESTART;
		}
	}
	else {
		value |= CLOSESTART;
	}

	return value;
}
