📄 shuntdowndlg.cpp
字号:
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 + -