VC驿站黑客编程(关机,重启,注销)
生活随笔
收集整理的這篇文章主要介紹了
VC驿站黑客编程(关机,重启,注销)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
此程序在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("關機"));//選擇按鈕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驿站黑客编程(关机,重启,注销)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pract
- 下一篇: 《Patterns, Principle