此程序在VS2013下编译通过,假设换到编译器,大家能够稍作改动使用
#include<Windows.h>
#include<tchar.h>
#include"resource1.h"
#pragma warning(disable:4996)
BOOL EnableShutDownPriv()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tkp = {0};
//打开当前程序的权限令牌
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
{
return FALSE;
}
if (!LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid))
{
CloseHandle(hToken);
return FALSE;
} tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; if (!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(TOKEN_PRIVILEGES),NULL,NULL))
{
CloseHandle(hToken);
return FALSE;
}
return true;
}
//winMain是一个win32程序的入口点,
//程序入口点: 1.console程序的入口点函数 main
// 2.win32程序的入口点函数 WinMain
// 3.dll32程序的入口点函数 DllMain
// 4.服务程序的入口点函数 ServiceMain
// 5.驱动程序入口点函数 Driver
//參数1,HINSTANCE hInstance 应用程序实例句柄
//參数2。HINSTANCE hPrevInstance前一个程序实例
//參数3。LPSTR lpCmdLine 是一个用户运行应用程序时传入的參数
//參数4,int nShowCmd假设有窗体以什么形态显示窗体,最大化,最小化
//reset window status 又一次设置window状态 /*
C4996以前不是警告么?如今升级啦? 尝试这个
1.Project Properties > Configuration Properties > C/C++ > General > SDL checks关掉 其它方法:
2.#pragma warning(disable: 4996)
3。 /wd 4996
*/ BOOL ReSetWindow(DWORD dwFlag, BOOL bForce)
{
//推断又一次设置的标志
switch (dwFlag)
{
case EWX_LOGOFF:
case EWX_REBOOT:
case EWX_SHUTDOWN:
case EWX_POWEROFF:
break;
default:
return FALSE;
}
//获取电脑系统版本号
OSVERSIONINFO osvi = { 0 };
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (!GetVersionEx(&osvi))
{
return FALSE;
} DWORD highVersion;
DWORD lowVersion;
//获取主版本号号
highVersion = osvi.dwMajorVersion;
//获取次版本号号
lowVersion = osvi.dwMinorVersion; DWORD plat = osvi.dwPlatformId; if (plat == VER_PLATFORM_WIN32_NT)
{
EnableShutDownPriv();
} //在window中通常是占领不同的位数表示不同的值,一般通过|来获取两个或两个以上的效果
dwFlag = bForce ? dwFlag | EWX_FORCE : dwFlag|EWX_FORCEIFHUNG;
ExitWindowsEx(dwFlag, 0);
}
INT_PTR CALLBACK DialogProc(
_In_ HWND hwndDlg,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
TCHAR tStr[20] = { 0 };
switch (uMsg)
{
case WM_INITDIALOG:
{
//获取窗体句柄
HWND hComBox = GetDlgItem(hwndDlg, IDC_COMBO1);
//往combobox中插入值
SendMessage(hComBox, CB_INSERTSTRING, 0, (LPARAM)_T("注销"));
SendMessage(hComBox, CB_INSERTSTRING, 1, (LPARAM)_T("重新启动"));
SendMessage(hComBox, CB_INSERTSTRING, 2, (LPARAM)_T("关机"));
//选择button
SendMessage(hComBox, CB_SELECTSTRING, 0, (LPARAM)_T("注销"));
//获取屏幕大小
int witdh = GetSystemMetrics(SM_CXSCREEN);
int height = GetSystemMetrics(SM_CYSCREEN);
RECT rect;
GetWindowRect(hwndDlg, &rect);
//获取对话框的大小
int dlgW = rect.right - rect.left;
int dlgH = rect.top = rect.bottom; //设置窗体位置
SetWindowPos(hwndDlg, 0, witdh / 2 - dlgW / 2, height / 2 - dlgH / 2, dlgW, dlgH, SWP_SHOWWINDOW); }
break;
case WM_COMMAND:
{
switch (wParam)
{
case IDOK: GetDlgItemText(hwndDlg, IDC_COMBO1, tStr, 20);
if (wcscmp(tStr, _T("注销")))
{
ReSetWindow(EWX_LOGOFF, FALSE);
}
else if (wcscmp(tStr, _T("重新启动")))
{
ReSetWindow(EWX_REBOOT, FALSE);
}
else if (wcscmp(tStr, _T("关机")))
{
ReSetWindow(EWX_SHUTDOWN, FALSE);
}
break;
case IDCANCEL:
if (MessageBox(NULL,_T("是否关闭"),_T("提示"),MB_OKCANCEL)==IDOK)
{
EndDialog(hwndDlg, IDCANCEL);
}
break;
default:
break;
}
}
break;
default:
break;
}
return 0;
} int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
if (strcmp(lpCmdLine, "/r") == 0)
{
ReSetWindow(EWX_REBOOT, FALSE);
}
else if (strcmp(lpCmdLine,"/f")==0)
{
ReSetWindow(EWX_LOGOFF, FALSE);
}
else if (strcmp(lpCmdLine,"/s")==0)
{
ReSetWindow(EWX_SHUTDOWN, FALSE);
}
else
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
} return 0;
}

VC驿站黑客编程(关机,重新启动,注销)的更多相关文章

  1. C# 实现系统关机、注销、重启、休眠、挂起

    原文:C# 实现系统关机.注销.重启.休眠.挂起 核心代码如下: using System; using System.Text; using System.Diagnostics; using Sy ...

  2. 书评第001篇:《C++黑客编程揭秘与防范》

    本书基本信息 作者:冀云(编著) 出版社:人民邮电出版社 出版时间:2012-6-1 ISBN:9787115280640 版次:1 页数:265 字数:406000 印刷时间:2012-6-1 开本 ...

  3. VC++动态链接库(DLL)编程深入浅出(zz)

    VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...

  4. 用VC进行COM编程所必须掌握的理论知识

    一.为什么要用COM 软件工程发展到今天,从一开始的结构化编程,到面向对象编程,再到现在的COM编程,目标只有一个,就是希望软件能象积方块一样是累起来的,是组装起来的,而不是一点点编出来的.结构化编程 ...

  5. Python黑客编程基础3网络数据监听和过滤

    网络数据监听和过滤 课程的实验环境如下: •      操作系统:kali Linux 2.0 •      编程工具:Wing IDE •      Python版本:2.7.9 •      涉及 ...

  6. Python黑客编程2 入门demo--zip暴力破解

    Python黑客编程2 入门demo--zip暴力破解 上一篇文章,我们在Kali Linux中搭建了基本的Python开发环境,本篇文章为了拉近Python和大家的距离,我们写一个暴力破解zip包密 ...

  7. 今天逛VC驿站 的收获

    1.C++ 如何定义一个定长字符串, 若不足位数,就补字符串"0"? eg: CString str1 = “123”;不足20位,前面补“0”,实现效果为“00000000000 ...

  8. 【转】VC++消息钩子编程

    VC++消息钩子编程

  9. VC++网络高级编程

    内含<VC网络高级编程>电子书 及源代码. 第一章.TCP/IP协议.第二章.Winsock网络编程接口:第二章.Visual C++与网络编程:第四章.基本网络编程技术:第五章.Teln ...

随机推荐

  1. MySQL笔记之视图的使用详解

    原文:http://www.jb51.net/article/36363.htm 1.什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门 ...

  2. 利用Java的反射与代理机制实现AOP

    在上一篇文章中,我们讲述了利用Java的反射机制中实现Spring中的IOC,在本文中,我们将更进一步,讲述用Java的反射和动态代理机制来实现Spring的AOP. 一.AOP概述 AOP(Aspe ...

  3. [Atcoder SHPC2018] Tutorial

    Link: SHPC2018 传送门 C: 一道看上去有些吓人的题目,不过$1e9$规模下的$n^m$代表肯定是可以约分的 可以发现能提供贡献的数对只有$2*(n-d)$种,那么总贡献为$2*(n-d ...

  4. 【数论】【欧拉函数】【筛法求素数】【乘法逆元】【快速幂取模】bzoj2186 [Sdoi2008]沙拉公主的困惑

    http://www.cnblogs.com/BLADEVIL/p/3490321.html http://www.cnblogs.com/zyfzyf/p/3997986.html 翻了翻题解,这两 ...

  5. 【点分治】bzoj1316 树上的询问

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #defin ...

  6. 6.2(java学习笔记)字节流

    一.FileInputStream 文件输入流从文件中获取输入字节.简单的说就是读取文件. 1.构造方法 FileInputStream(File file)//根据指定文件对象创建一个输入流 2.常 ...

  7. Java多线程——锁概念与锁优化

    为了性能与使用的场景,Java实现锁的方式有非常多.而关于锁主要的实现包含synchronized关键字.AQS框架下的锁,其中的实现都离不开以下的策略. 悲观锁与乐观锁 乐观锁.乐观的想法,认为并发 ...

  8. Spring IOC 中三种注入方式

    项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...

  9. identifier is too long 异常处理

    修改了oracle中的表. 报 identifier is too long 错误 我执行的脚本是: ---备份create table MDT_AGREEMENTMANAGEMENT_2018080 ...

  10. nginx+php简单配置环境

    首先我的需求是: 1. 需要有PHP的服务.web目录存放在各处. 2. 需要有多个端口. 步骤: 1. 安装nginx php,我的系统是mac 所以安装使用brew, 一键完成... 2. 开启p ...