1.簡(jiǎn)單的關(guān)機(jī)代碼與示例
成都創(chuàng)新互聯(lián)成立以來(lái)不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點(diǎn),以客戶需求中心、市場(chǎng)為導(dǎo)向”的快速反應(yīng)體系。對(duì)公司的主營(yíng)項(xiàng)目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計(jì)、行業(yè) / 企業(yè)門(mén)戶設(shè)計(jì)推廣、行業(yè)門(mén)戶平臺(tái)運(yùn)營(yíng)、重慶APP開(kāi)發(fā)公司、手機(jī)網(wǎng)站開(kāi)發(fā)、微信網(wǎng)站制作、軟件開(kāi)發(fā)、雙線服務(wù)器托管等實(shí)行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從成都創(chuàng)新互聯(lián)可以獲得的服務(wù)效果。利用system函數(shù)關(guān)閉計(jì)算機(jī)。
#include#includeint main()
{
system("shutdown -s -t 3");
return 0;
}
· 調(diào)用system函數(shù)需要包含windows.h。
shutdown -s -t 3 -->表示關(guān)機(jī)在三秒后關(guān)機(jī);
-s -->表示關(guān)機(jī);
-t -->后面跟時(shí)間,時(shí)間的單位為秒,表示幾秒后關(guān)機(jī)。如果改為shutdown -s -t 0則表示立即關(guān)機(jī);
使用時(shí)注意指令之間的空格。
· 取消關(guān)機(jī)可以使用
system("shutdown -a");
-a -->表示取消關(guān)機(jī)。
· 示例
#include#includeint main()
{
printf("你的電腦將于1分鐘后關(guān)閉,回復(fù)[我還不想關(guān)機(jī)]取消關(guān)機(jī)。\n");
system("shutdown -s -t 60");
flag:
char str[13];
scanf("%s",str);
if (strcmp(str,"我還不想關(guān)機(jī)")==0)
{
system("shutdown -a");
printf("已取消關(guān)機(jī)。\n");
}
else
{
goto flag;
}
return 0;
}
函數(shù)strcmp用于比較兩個(gè)字符串是否相等,相等則為0。通過(guò)scanf函數(shù)來(lái)接收用戶消息,如果接收到的用戶消息是"我還不想關(guān)機(jī)"則取消關(guān)機(jī),否則關(guān)機(jī)倒計(jì)時(shí)繼續(xù)。
· 實(shí)現(xiàn)自定義的關(guān)機(jī)倒計(jì)時(shí)
#include#includeint main()
{
char str[20] = "shutdown -s -t ";
printf("請(qǐng)輸入要關(guān)機(jī)的時(shí)間,單位為秒。\n");
int a = 0;
scanf("%d",&a);
printf("電腦將于%d秒后關(guān)機(jī)。\n",a);
char time[5];
sprintf(time, "%d", a);
strcat(str, time);
strcat(str,"\0");
system(str);
return 0;
}
函數(shù)strcat可以將兩個(gè)字符串連接,將參數(shù)2鏈接到參數(shù)1字符串的后面。比如strcat("str","222"),執(zhí)行后會(huì)把222連到字符串str的最后一個(gè)字符。假設(shè)str是111,那么執(zhí)行后結(jié)果是111222,即把222連接到111的后面。不過(guò)函數(shù)strcat的兩個(gè)參數(shù)必須為字符串,因此需要把整形變量a轉(zhuǎn)為字符串。使用sprintf函數(shù)進(jìn)行轉(zhuǎn)換即可,由于a是屬于整形變量,因此sprintf中間的轉(zhuǎn)義字符應(yīng)為%d,之后a會(huì)被轉(zhuǎn)換到time字符串里,再使用strcat將time連接到str后即可。如果a的值為60,則運(yùn)行后str值為"shutdown -s -t 60"。
2. 調(diào)節(jié)進(jìn)程權(quán)限,使用Win API函數(shù)實(shí)現(xiàn)關(guān)機(jī)
API函數(shù)關(guān)機(jī)代碼:
InitiateSystemShutdownEx(NULL,(LPSTR)"你的計(jì)算機(jī)即將關(guān)閉",60,FALSE, FALSE, SHTDN_REASON_MAJOR_HARDWARE);
函數(shù)InitiateSystemShutdown可用于關(guān)閉計(jì)算機(jī),它比使用system關(guān)機(jī)函數(shù)有個(gè)過(guò)人之處,就是它不僅能關(guān)機(jī),還可以重啟。不足的是它需要SE_SHUTDOWN_NAME權(quán)限。
獲取SE_SHUTDOWN_NAME權(quán)限代碼:
bool AdjustPrivilege()
{
HANDLE tk;
TOKEN_PRIVILEGES p;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&tk);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&p.Privileges[0].Luid);
p.PrivilegeCount = 1;
p.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bool ret = AdjustTokenPrivileges(tk,FALSE,&p,sizeof(p),NULL,NULL);
if (ret == true)
{
return true;
}
return false;
}
函數(shù)InitiateSystemShutdownEx參數(shù):
參數(shù)1: lpMachineName,表示要關(guān)機(jī)的計(jì)算機(jī)網(wǎng)絡(luò)名稱,如果想關(guān)閉當(dāng)前自己的這臺(tái)計(jì)算機(jī),這個(gè)參數(shù)帶NULL。
參數(shù)2: lpMessage,表示關(guān)機(jī)時(shí)要不要有一個(gè)提示用戶即將關(guān)機(jī)的彈窗,帶NULL則不需要彈窗,否則帶字符串表示需要彈窗,而該字符串就是彈窗的文本內(nèi)容,筆者在參數(shù)2的字符串為"你的計(jì)算機(jī)即將關(guān)閉",則運(yùn)行結(jié)果如下圖所示:
參數(shù)3: dwTimeout,關(guān)機(jī)的倒計(jì)時(shí)。和上面的system關(guān)機(jī)函數(shù)的時(shí)間類似,這里寫(xiě)個(gè)整數(shù),比如60則表示60秒后關(guān)機(jī)。
參數(shù)4: bForceAppsClosed,這個(gè)參數(shù)只能寫(xiě)true/false。如果是寫(xiě)入真,則未保存更改的應(yīng)用程序?qū)⒈粡?qiáng)行關(guān)閉。如果是false,則系統(tǒng)會(huì)詢問(wèn)你是否要保存未保存的程序。
參數(shù)5: bRebootAfterShutdown,表示需不需要重啟。此參數(shù)只能寫(xiě)true/false。如果是true,則關(guān)機(jī)后立即重啟。如果是false則系統(tǒng)會(huì)將所有緩存刷新到磁盤(pán)再關(guān)機(jī)。
參數(shù)6: 關(guān)機(jī)的原因。系統(tǒng)每次關(guān)機(jī)都會(huì)向系統(tǒng)的日志文件寫(xiě)入關(guān)機(jī)的信息,比如關(guān)機(jī)原因。這個(gè)參數(shù)有很多,即關(guān)機(jī)原因有很多,筆者這里使用SHTDN_REASON_MAJOR_HARDWARE表示因硬件問(wèn)題而關(guān)機(jī)。用戶可以選擇很多原因?qū)懭?,比如SHTDN_REASON_MAJOR_POWER電源故障、SHTDN_REASON_MAJOR_SYSTEM系統(tǒng)故障等等,帶NULL則未找到關(guān)機(jī)原因,但帶NULL可能會(huì)延遲關(guān)機(jī)時(shí)間。
完整代碼:
#include#include// 調(diào)節(jié)進(jìn)程權(quán)限,申請(qǐng)SE_SHUTDOWN_NAME特權(quán)
bool AdjustPrivilege()
{
HANDLE tk;
TOKEN_PRIVILEGES p;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&tk);
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&p.Privileges[0].Luid);
p.PrivilegeCount = 1;
p.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
bool ret = AdjustTokenPrivileges(tk,FALSE,&p,sizeof(p),NULL,NULL);
if (ret == true)
{
return true;
}
return false;
}
int main()
{
? ? AdjustPrivilege();
printf("60秒后將關(guān)閉你的計(jì)算機(jī)\n");
InitiateSystemShutdownEx(NULL, (LPSTR)"你的計(jì)算機(jī)即將關(guān)閉", 60, FALSE, FALSE, SHTDN_REASON_MAJOR_HARDWARE);
return 0;
}
· 取消關(guān)機(jī)還可以用
AbortSystemShutdown(NULL);
該函數(shù)可以中止計(jì)算機(jī)關(guān)機(jī),相對(duì)于system("shutdown -a"),帶NULL表示本地計(jì)算機(jī)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧