正在为您跳转...
二十四橋明月夜
正文
2018-08-15 11:55:46 | 分类:默认分类 | 标签:

编程实现Windows关机、重启、注销

 要想编程使Windows关机、重启或者注销,可以使用ExWindowsEx这个API函数,该函数只有两个参数,第一个表示关机动作的标志,也就是你要让该函数关机呢,还是重启,还是注销等。可以使用EWX_SHUTDOWN、EWX_REBOOT、EWX_LOGOFF等标志常量,分别表示关机、重启、注销。另外如果加上EWX_FORCE这个标志常量的话,该表明强制执行该操作。Windows在执行以上操作的时候会首先给每个正在运行中的程序发送一个WM_QUERYENDSESSION消息,告诉它们现在我要退出系统了,你们赶快保存东西啊!如果这时候其中有某一个程序对该消息回应了“不”,系统就不会再执行以上操作了。而如果指定了EWX_FORCE标志,系统则不会发送消息去询问各个程序了,而是直接强制关闭所有程序,退出系统。所以说当指定了EWX_FORCE标志的时候要小心,因为这样做可能会丢失一些东西。(比如文件可能会没保存)。第二参数是保留参数,可能直接传递0值。另外,当在Win2K以上的操作系统执行关机和重启操作时,需要调用该函数的进程首先获得关机特权,不然函数会调用失败。

#include <windows.h>

//使能关机特权函数

BOOL EnableShutdownPrivilege()

{

    HANDLE hProcess = NULL;

    HANDLE hToken = NULL;

    LUID uID = {0};

    TOKEN_PRIVILEGES stToken_Privileges = {0};

    hProcess = ::GetCurrentProcess();  //获取当前应用程序进程句柄

    

    if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))  //打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)

        return FALSE;

    if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))  //获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)

        return FALSE;

    stToken_Privileges.PrivilegeCount = 1;  //欲调整的权限个数

    stToken_Privileges.Privileges[0].Luid = uID;  //权限的LUID

    stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  //权限的属性,SE_PRIVILEGE_ENABLED为使能该权限

    

    if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL))  //调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)

        return FALSE;

    if(::GetLastError() != ERROR_SUCCESS)  //查看权限是否调整成功

        return FALSE;

    ::CloseHandle(hToken);

    return TRUE;

}

//关机函数

BOOL Shutdown(BOOL bForce)

{

    EnableShutdownPrivilege();  //使能关机特权函数

    if(bForce)

        return ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);  //强制关机

    else

        return ::ExitWindowsEx(EWX_SHUTDOWN,0);

}

//注销函数

BOOL Logoff(BOOL bForce)

{

    if(bForce)

        return ::ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);  //强制注销

    else

        return ::ExitWindowsEx(EWX_LOGOFF,0);

}

//重启函数

BOOL Reboot(BOOL bForce)

{

    EnableShutdownPrivilege();  //使能关机特权函数

    if(bForce)

        return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);  //强制重启

    else

        return ::ExitWindowsEx(EWX_REBOOT,0);

}

int main()

{

    Logoff(FALSE);  //注销

    Reboot(FALSE);  //重启

    Shutdown(FALSE);  //关机

    Logoff(TRUE);  //强制注销

    Reboot(TRUE);  //强制重启

    Shutdown(TRUE);  //强制关机

    return 0;

}

另外可参考:http://www.sharejs.com/codes/cpp/6256

http://wenku.baidu.com/view/b668afd028ea81c758f578f4.html

---------------------------------------------------------------------

#include<stdio.h>  

#include<stdlib.h>  

#include<errno.h>  

#include<string.h>  

#include<sys/types.h>  

#include<netinet/in.h>  

#include<sys/socket.h>  

#include<sys/wait.h>  

  

#define PORT 1500//端口号   

#define BACKLOG 5/*最大监听数*/   

  

int main(){  

    int sockfd,new_fd;/*socket句柄和建立连接后的句柄*/  

    struct sockaddr_in my_addr;/*本方地址信息结构体,下面有具体的属性赋值*/  

    struct sockaddr_in their_addr;/*对方地址信息*/  

    int sin_size;  

  

    sockfd=socket(AF_INET,SOCK_STREAM,0);//建立socket   

    if(sockfd==-1){  

        printf("socket failed:%d",errno);  

        return -1;  

    }  

    my_addr.sin_family=AF_INET;/*该属性表示接收本机或其他机器传输*/  

    my_addr.sin_port=htons(PORT);/*端口号*/  

    my_addr.sin_addr.s_addr=htonl(INADDR_ANY);/*IP,括号内容表示本机IP*/  

    bzero(&(my_addr.sin_zero),8);/*将其他属性置0*/  

    if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){//绑定地址结构体和socket  

        printf("bind error");  

        return -1;  

    }  

        listen(sockfd,BACKLOG);//开启监听 ,第二个参数是最大监听数   

        while(1){  

            sin_size=sizeof(struct sockaddr_in);  

            new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size);//在这里阻塞知道接收到消息,参数分别是socket句柄,接收到的地址信息以及大小   

            if(new_fd==-1){  

                printf("receive failed");  

        } else{  

            printf("receive success");  

            send(new_fd,"Hello World!",12,0);//发送内容,参数分别是连接句柄,内容,大小,其他信息(设为0即可)   

        }  

    }  

    return 0;  

---------------------------------------------------------------------------

#include<stdio.h>  

#include<stdlib.h>  

#include<errno.h>  

#include<string.h>  

#include<sys/types.h>  

#include<netinet/in.h>  

#include<sys/socket.h>  

#include<sys/wait.h>  

  

   

#define DEST_PORT 1500//目标地址端口号   

#define DEST_IP "127.0.0.1"/*目标地址IP,这里设为本机*/   

#define MAX_DATA 100//接收到的数据最大程度   

  

int main(){  

    int sockfd,new_fd;/*cocket句柄和接受到连接后的句柄 */  

    struct sockaddr_in dest_addr;/*目标地址信息*/  

    char buf[MAX_DATA];//储存接收数据   

  

    sockfd=socket(AF_INET,SOCK_STREAM,0);/*建立socket*/  

    if(sockfd==-1){  

        printf("socket failed:%d",errno);  

    }  

  

  

    //参数意义见上面服务器端   

    dest_addr.sin_family=AF_INET;  

    dest_addr.sin_port=htons(DEST_PORT);  

    dest_addr.sin_addr.s_addr=inet_addr(DEST_IP);  

    bzero(&(dest_addr.sin_zero),8);  

      

    if(connect(sockfd,(struct sockaddr*)&dest_addr,sizeof(struct sockaddr))==-1){//连接方法,传入句柄,目标地址和大小   

        printf("connect failed:%d",errno);//失败时可以打印errno   

    } else{  

        printf("connect success");  

        recv(sockfd,buf,MAX_DATA,0);//将接收数据打入buf,参数分别是句柄,储存处,最大长度,其他信息(设为0即可)。   

        printf("Received:%s",buf);  

    }  

    close(sockfd);//关闭socket   

    return 0;  

}  

-------------------------------------------------------------

#ifndef __H_SHUTDOWN_H__

#define __H_SHUTDOWN_H__

typedef enum _SHUTDOWN_ACTION

{

    ShutdownNoReboot,

    ShutdownReboot,

    ShutdownPowerOff

} SHUTDOWN_ACTION;

typedef DWORD (WINAPI* lpNtShutdownSystem)(SHUTDOWN_ACTION Action);

typedef DWORD (WINAPI* lpNtSetSystemPowerState)(IN POWER_ACTION SystemAction,

                                                IN SYSTEM_POWER_STATE MinSystemState,

                                                IN ULONG Flags);

class KsSystemDown

{

protected:

    HMODULE hNtdll;

    TOKEN_PRIVILEGES tkp;

    HANDLE hToken;

    lpNtShutdownSystem NtShutdownSystem;

    lpNtSetSystemPowerState NtSetSystemPowerState;

public:

    BOOL SystemShutdown(SHUTDOWN_ACTION action)

    {

        if (!NtShutdownSystem)

            return FALSE;

        DWORD dwRet = NtShutdownSystem(action);

        if (dwRet == 0)

            return TRUE;

        else

            return FALSE;

    }

    BOOL SystemPowerdown(IN POWER_ACTION SystemAction,IN SYSTEM_POWER_STATE MinSystemState,IN ULONG Flags)

    {

        if (!NtSetSystemPowerState)

            return FALSE;

        DWORD dwRet = NtSetSystemPowerState(SystemAction,MinSystemState,Flags);

        if (dwRet == 0)

            return TRUE;

        else

            return FALSE;

    }

    BOOL CommonLogoff()

    {

        return Shutdown(EWX_LOGOFF);

    }

    BOOL CommonShutdown()

    {

        return Shutdown((EWX_POWEROFF|EWX_SHUTDOWN));

    }

    BOOL CommonReBoot()

    {

        return Shutdown(EWX_REBOOT);

    }

    BOOL FastLogoff()

    {

        return Shutdown(EWX_LOGOFF|EWX_FORCE);

    }

    BOOL FastShutdown()

    {

        return Shutdown(EWX_POWEROFF|EWX_SHUTDOWN|EWX_FORCE);

    }

    BOOL FastReboot()

    {

        return Shutdown(EWX_REBOOT|EWX_FORCE);

    }

    BOOL Shutdown(DWORD dwValue)

    {

        return ExitWindowsEx(dwValue,0);

    }

    BOOL SuperShutdown()

    {

        if (NtShutdownSystem != NULL)

            return NtShutdownSystem(ShutdownNoReboot);

        else

            return FALSE;

    }

    BOOL SuperReboot()

    {

        if (NtShutdownSystem != NULL)

            return NtShutdownSystem(ShutdownReboot);

        else

            return FALSE;

    }

public:

    KsSystemDown():

      NtShutdownSystem(NULL),NtSetSystemPowerState(NULL)

      {

          OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&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, NULL, 0);

          CloseHandle(hToken);

          hNtdll = GetModuleHandle("ntdll.dll");

          if (hNtdll)

          {

              NtShutdownSystem = (lpNtShutdownSystem)GetProcAddress(hNtdll,"NtShutdownSystem");

              NtSetSystemPowerState = (lpNtSetSystemPowerState)GetProcAddress(hNtdll,"NtSetSystemPowerState");

          }

      }

      ~KsSystemDown()

      {

          tkp.Privileges[0].Attributes = 0; 

          AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);

      }

};

#endif

//该代码片段来自于: http://www.sharejs.com/codes/cpp/6256

====================================

12

13

14

15

16

17

18

19

20

21

22

23

24

 

#include <stdio.h>

int main(){

  int a;

  printf("Input integer number:");

  scanf("%d",&a);

  if(a==1){

    printf("Monday\n");

  }else if(a==2){

    printf("Tuesday\n");

  }else if(a==3){

    printf("Wednesday\n");

  }else if(a==4){

    printf("Thursday\n");

  }else if(a==5){

    printf("Friday\n");

  }else if(a==6){

    printf("Saturday\n");

  }else if(a==7){

    printf("Sunday\n");

  }else{

    printf("error\n");

  }

  return 0;

}

switch (nControl)

{

case    1:     P1 = 0xFE;     //i =1;  执行P1 = 0XFE;

break;      //执行完成后跳出

case    2:     P1 = 0xFD;     //i =2;  执行P1 = 0XFD;

break;

case    3:     P1 = 0xFB;     //i =3;  执行P1 = 0XFB;

break;

case    4:     P1 = 0xF7      //i =4;  执行P1 = 0X7E;

break;

default:    

break;     //如果i 不符合以上条件直接跳出不执行任何东西

}

 


<< 上一篇:《屋面檩条设计》
下一篇:《C++隐藏程序主界面》 >>
评论
遵守文明上网宣言,净化网络环境
声明 本平台提供的所有内容仅供学习、分享与交流,平台无法保证内容一定是正确可靠的。通过使用本平台内容而带来的风险与本平台无关,请知悉。