⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shuntdowndlg.cpp

📁 一个用c++写的自动关机(VC源码) 很有意思的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	SetTimer(SHOWTIME, 1000, NULL);

	// 注册系统热键(暂不检测成功与否)
	RegisterHotKey(m_hWnd, 0, MOD_SHIFT | MOD_CONTROL, 'H');
	RegisterHotKey(m_hWnd, 1, MOD_SHIFT | MOD_CONTROL, 'h');

	CString strTmp1, strTmp2 = "";

	// 年
	for(int i = time.nYear ; i < time.nYear + 10 ; i++)
	{
		strTmp1.Format("%d年", i);
		m_Year.AddString(strTmp1);
		m_Year.SetCurSel(0);
	}

	// 月
	for(int i = 1 ; i <= 12 ; i++)
	{
		strTmp1.Format("%.2d", i);
		m_Month.AddString(strTmp1 + "月");

		strTmp2.Format("%.2d", time.nMonth);
		if(strTmp1 == strTmp2)
			m_Month.SetCurSel(i - 1);
	}

	// 日
 	if(time.nMonth == 2)
	{
		if(IsRYear(time.nYear))
		{
			for(int i = 1; i <= 28; i++)
			{
				strTmp1.Format("%.2d", i);
				m_Day.AddString(strTmp1 + "日");

				strTmp2.Format("%.2d", time.nDay);
				if(strTmp1 == strTmp2)
					m_Day.SetCurSel(i - 1);
			}
		}
		else
		{
			for(int i = 1; i <= 29; i++)
			{
				strTmp1.Format("%.2d", i);
				m_Day.AddString(strTmp1 + "日");

				strTmp2.Format("%.2d", time.nDay);
				if(strTmp1 == strTmp2)
					m_Day.SetCurSel(i - 1);
			}
		}
	}
	else
	{
		int nMax = (time.nMonth == 1 || time.nMonth == 3 || time.nMonth == 5 || time.nMonth == 7 || time.nMonth == 8 || time.nMonth == 10 || time.nMonth == 12) ? 31 : 30;

		for(int i = 1; i <= nMax; i++)
		{
			strTmp1.Format("%.2d", i);
			m_Day.AddString(strTmp1 + "日");

			strTmp2.Format("%.2d", time.nDay);
			if(strTmp1 == strTmp2)
				m_Day.SetCurSel(i - 1);
		}
	}

	// 时
	for(int i = 0; i <= 23; i++)
	{
		strTmp1.Format("%.2d", i);
		m_Hour.AddString(strTmp1 + "时");	
	}

	// 分
	for(int i = 0; i <= 59; i++)
	{
		strTmp1.Format("%.2d", i);
		m_Second.AddString(strTmp1 + "分");
	}
}

// 取系统时间
void CShuntDownDlg::GetTime(PTIME pTime)
{
	memset(pTime, 0, sizeof(TIME));

	SYSTEMTIME systime;
	::GetSystemTime(&systime);

	pTime->nYear		= systime.wYear;			// year
	pTime->nMonth		= systime.wMonth;			// month
	pTime->nHour		= systime.wHour + 8 >= 24 ? systime.wHour + 8 - 24 : systime.wHour + 8;	// hour
	pTime->nDay			= pTime->nHour < 8 ? systime.wDay + 1 : systime.wDay;					// day
	pTime->nMinute		= systime.wMinute;			// minute
	pTime->nSecond		= systime.wSecond;			// second
	pTime->nMillisecond	= systime.wMilliseconds;	// millisecond
}

// 关机函数
bool CShuntDownDlg::ShuntDown()
{
	OSVERSIONINFOEX osvi;
	osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);
	if(!GetVersionEx((OSVERSIONINFO *)&osvi))
		return false;

	switch(osvi.dwPlatformId)
	{
	case VER_PLATFORM_WIN32_WINDOWS:
		if(	(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==10) || //win 98
			(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==90) || //win Me
			(osvi.dwMajorVersion==3 && osvi.dwMinorVersion ==51) || //win NT 3.51
			(osvi.dwMajorVersion==4 && osvi.dwMinorVersion ==0))	//win NT 4.0
		{
			//强制终止进程, 关机
			return ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 1) == 0 ? false : true;
		}
		break;
	case VER_PLATFORM_WIN32_NT:
		if(	(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==0) ||	//win 2000
			(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==1) ||	//win xp
			(osvi.dwMajorVersion==5 && osvi.dwMinorVersion ==2))	//win 2003
		{
			// 提权

			HANDLE hToken;
			TOKEN_PRIVILEGES tkp;
			OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
			LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
			tkp.PrivilegeCount = 1;
			tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
			AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
			CloseHandle(hToken);

			//强制终止进程, 关机
			return ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 1) == 0 ? false : true;
		}
		break;
	default:
		return false;
	}
	return false;
}

// 关闭一些窗口
void CShuntDownDlg::CloseWindow()
{
	{	// 立即结束窗口
		FindWnd findwnd;
		vector<HWND> hWnds = findwnd.FindToplevel(0x94C808C4, 0x00010101, "#32770");
		for(int i = 0; i < hWnds.size(); i++)
		{
			HWND hWnd = findwnd.FindChild(hWnds[i], 0x00000103, 0x50010000, 0x00000004, "Button", "立即结束(&E)");
			if(hWnd != (HWND)0xFFFF)
			{
				::SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
				::SendMessage(hWnd, WM_LBUTTONUP, 0, 0);
			}
		}
	}

	{	// 影子系统窗口
		FindWnd findwnd;
		vector<HWND> hWnds = findwnd.FindToplevel(0x94000044, 0x00010000, "#32770");
		for(int i = 0; i < hWnds.size(); i++)
		{
			HWND hWnd = findwnd.FindChild(hWnds[i], 0x000003F2, 0x5001000B, 0x00000004, "Button", "关机(&U)");
			if(hWnd != (HWND)0xFFFF)
			{
				::SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
				::SendMessage(hWnd, WM_LBUTTONUP, 0, 0);
			}
		}
	}

	{	// 发送错误报告窗口
		FindWnd findwnd;
		vector<HWND> hWnds = findwnd.FindToplevel(0x94C000C4, 0x00010109, "#32770");
		for(int i = 0; i < hWnds.size(); i++)
		{
			HWND hWnd = findwnd.FindChild(hWnds[i], 0x000003E9, 0x50010001, 0x00000004, "Button", "不发送(&D)");
			if(hWnd != (HWND)0xFFFF)
			{
				::SendMessage(hWnd, WM_LBUTTONDOWN, 0, 0);
				::SendMessage(hWnd, WM_LBUTTONUP, 0, 0);
			}
		}
	}
}

void CShuntDownDlg::OnCancel() 
{
	if(m_bSetting)
	{
		if(IDYES == ::MessageBox(m_hWnd, "如果退出本程序, 自动关机功能将不再生效, 您确定要退出吗?", "提示", MB_YESNO | MB_DEFBUTTON2))
			CDialog::OnCancel();
	}
	else
		CDialog::OnCancel();
}

void CShuntDownDlg::OnOK() 
{
	if(m_bSetting)
	{
		if(IDYES == ::MessageBox(m_hWnd, "如果退出本程序, 自动关机功能将不再生效, 您确定要退出吗?", "提示", MB_YESNO | MB_DEFBUTTON2))
			CDialog::OnOK();
	}
	else
		CDialog::OnCancel();
}

// 当"年份"改变时
void CShuntDownDlg::OnSelchangeComboYear() 
{
	TIME time;
	GetTime(&time);
	char buf[50] = {0};
	
	// 年
	::GetDlgItemText(m_hWnd, IDC_COMBO_YEAR, buf, 5);
	int nYear = atoi(buf);


	// 月
	memset(buf, 0, 50);
	::GetDlgItemText(m_hWnd, IDC_COMBO_MONTH, buf, 3);
	int nMonth = atoi(buf);


	CString strTmp1, strTmp2 = "";

	// 日
	for(int i = m_Day.GetCount() - 1 ; i >= 0; i--)
		m_Day.DeleteString(m_Day.GetCount() - 1);

	
	if(nMonth == 2)
	{
		if(IsRYear(nYear))
		{
			for(int i = 1; i <= 28; i++)
			{
				strTmp1.Format("%.2d", i);
				m_Day.AddString(strTmp1 + "日");

				strTmp2.Format("%.2d", time.nDay);
				if(strTmp1 == strTmp2)
					m_Day.SetCurSel(i - 1);
			}
		}
		else
		{
			for(int i = 1; i <= 29; i++)
			{
				strTmp1.Format("%.2d", i);
				m_Day.AddString(strTmp1 + "日");

				strTmp2.Format("%.2d", time.nDay);
				if(strTmp1 == strTmp2)
					m_Day.SetCurSel(i - 1);
			}
		}
	}
	else
	{
		int nMax = (nMonth == 1 || nMonth == 3 || nMonth == 5 || nMonth == 7 || nMonth == 8 || nMonth == 10 || nMonth == 12) ? 31 : 30;
		for(int i = 1; i <= nMax; i++)
		{
			strTmp1.Format("%.2d", i);
			m_Day.AddString(strTmp1 + "日");

			strTmp2.Format("%.2d", time.nDay);
			if(strTmp1 == strTmp2)
				m_Day.SetCurSel(i - 1);
		}
	}
}

// 当"月份"改变时
void CShuntDownDlg::OnSelchangeComboMonth() 
{
	TIME time;
	GetTime(&time);
	char buf[50] = {0};
	
	// 年
	::GetDlgItemText(m_hWnd, IDC_COMBO_YEAR, buf, 5);
	int nYear = atoi(buf);


	// 月
	memset(buf, 0, 50);
	::GetDlgItemText(m_hWnd, IDC_COMBO_MONTH, buf, 3);
	int nMonth = atoi(buf);


	CString strTmp1, strTmp2 = "";

	// 日
	for(int i = m_Day.GetCount() - 1 ; i >= 0; i--)
		m_Day.DeleteString(m_Day.GetCount() - 1);

	
	if(nMonth == 2)
	{
		if(IsRYear(nYear))
		{
			for(int i = 1; i <= 28; i++)
			{
				strTmp1.Format("%.2d", i);
				m_Day.AddString(strTmp1 + "日");

				strTmp2.Format("%.2d", time.nDay);
				if(strTmp1 == strTmp2)
					m_Day.SetCurSel(i - 1);
			}
		}
		else
		{
			for(int i = 1; i <= 29; i++)
			{
				strTmp1.Format("%.2d", i);
				m_Day.AddString(strTmp1 + "日");

				strTmp2.Format("%.2d", time.nDay);
				if(strTmp1 == strTmp2)
					m_Day.SetCurSel(i - 1);
			}
		}
	}
	else
	{
		int nMax = (nMonth == 1 || nMonth == 3 || nMonth == 5 || nMonth == 7 || nMonth == 8 || nMonth == 10 || nMonth == 12) ? 31 : 30;
		for(int i = 1; i <= nMax; i++)
		{
			strTmp1.Format("%.2d", i);
			m_Day.AddString(strTmp1 + "日");

			strTmp2.Format("%.2d", time.nDay);
			if(strTmp1 == strTmp2)
				m_Day.SetCurSel(i - 1);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -