int ShutdownWindows(){ HANDLE hToken; LUID takeOwnershipValue; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return 0; if (!LookupPrivilegeValue(0, SE_SHUTDOWN_NAME, &takeOwnershipValue)) return 0; tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = takeOwnershipValue; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &tkp, sizeof(TOKEN_PRIVILEGES), 0, 0); if (GetLastError()) return 0; return ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN,0);}
#include <QtGui>#include <qt_windows.h>#include <Windows.h>#include "button.h"class Widget : public QWidget{ Q_OBJECTpublic: Widget(QWidget *parent = 0); simpleQButton *btn; int ShutdownWindows(); QMessageBox *b; ~Widget();public slots: void clickedBtn(); void someOtherSlot();};и срр файл :#include "widget.h"Widget::Widget(QWidget *parent) : QWidget(parent){ btn = new simpleQButton; btn->setSomeText("some text setted"); connect(btn,SIGNAL(clicked()), this,SLOT(clickedBtn())); QHBoxLayout *h = new QHBoxLayout; h->addWidget(btn); setLayout(h);}void Widget::clickedBtn(){ ShutdownWindows();}// взята с форума.int ShutdownWindows(){ HANDLE hToken; TOKEN_PRIVILEGES tkp; DWORD dwRetVal;// Получаем маркер (token) для этого процесса. if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return (GetLastError());// Получаем LUID для привилегии выключения (shutdown). LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;// Получаем привилегию выключения (shutdown) для этого процесса. AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); if ((dwRetVal = GetLastError()) != ERROR_SUCCESS) return dwRetVal;// Выключаем или перезагружаем в соответствие с ExitFlags if (!ExitWindowsEx(EWX_LOGOFF|EWX_REBOOT, 0)) return (GetLastError());}void Widget::someOtherSlot(){ }Widget::~Widget(){ }
LIBS += user32.lib \ Advapi32.lib