Выключить комп.
не перезагрузить, не выйти из windows,
а именно выключить.(XP)
ExitWindowsEx(EWX_POWEROFF, EWX_FORCE)
На форме:
Option Explicit
Private Sub CmdExit_Click()
Dim mmm As Long
mmm = ExitWindowsEx(EWX_POWEROFF, EWX_FORCE)
End Sub
В Модуле:
Option Explicit
Public Const EWX_POWEROFF = 0
Public Const EWX_FORCE = 1
Declare Function ExitWindows Lib "user32" _
(ByVal dwReserved As Long, ByVal uReturnCode As Long) As Long
Комп не выключается. А снимаются все задачи и вылетает диалоговое окно смена пользователя.
А в левом нижнем углу кнопка выключить комп.
Шляпа. У меня XP может что либо ещё я пропустил.
сначала
BOOL OpenThreadToken(
HANDLE ThreadHandle, // handle to thread
DWORD DesiredAccess, // access to process
BOOL OpenAsSelf, // process or thread security
PHANDLE TokenHandle // handle to open access token
);
потом
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // original state buffer
PDWORD ReturnLength // required buffer size
);
З.Ы. Посижу, поразбираюсь...
Сорри, не дочитал примечания, у процесса для выключения или перезагрузки компа должена быть привилегия SE_SHUTDOWN_NAME, чтобы его получить
сначала
BOOL OpenThreadToken(
HANDLE ThreadHandle, // handle to thread
DWORD DesiredAccess, // access to process
BOOL OpenAsSelf, // process or thread security
PHANDLE TokenHandle // handle to open access token
);
потом
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // handle to token
BOOL DisableAllPrivileges, // disabling option
PTOKEN_PRIVILEGES NewState, // privilege information
DWORD BufferLength, // size of buffer
PTOKEN_PRIVILEGES PreviousState, // original state buffer
PDWORD ReturnLength // required buffer size
);
З.Ы. Посижу, поразбираюсь...
Что за дела!!!!
Неужели ни кто не знает как выключить комп в Xp
Куда мир катиться.!?
Куда мир катиться.!?
Действительно, куда мир катиться, трудно посмотреть что делать с этими функциями???
Держи код или мне его еще и VB переводить
HANDLE hToken=NULL;
TOKEN_PRIVILEGES tkp;
hProcess=GetCurrentProcess();
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &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, (PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
MessageBox(NULL, "AdjustTokenPrivileges enable failed.", "Error", MB_OK);
ExitWindowsEx(EWX_POWEROFF | EWX_FORCE, 0);
З.Ы. Перевел бы, но у меня нет утилиты для поиска импортов API функций...
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const VER_PLATFORM_WIN32_NT = 2
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
'Detect if the program is running under Windows NT
Public Function IsWinNT() As Boolean
Dim myOS As OSVERSIONINFO
myOS.dwOSVersionInfoSize = Len(myOS)
GetVersionEx myOS
IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function
'set the shut down privilege for the current application
Private Sub EnableShutDown()
Dim hProc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
hProc = GetCurrentProcess()
OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
mPriv.PrivilegeCount = 1
mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
mPriv.Privileges(0).pLuid = mLUID
' enable shutdown privilege for the current application
AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub
' Shut Down NT
Public Sub ShutDownNT(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_SHUTDOWN
If Force Then Flags = Flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx Flags, 0
End Sub
'Restart NT
Public Sub RebootNT(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_REBOOT
If Force Then Flags = Flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx Flags, 0
End Sub
'Log off the current user
Public Sub LogOffNT(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_LOGOFF
If Force Then Flags = Flags + EWX_FORCE
ExitWindowsEx Flags, 0
End Sub
'In a form
'This project needs a form with three command buttons
Private Sub Command1_Click()
LogOffNT True
End Sub
Private Sub Command2_Click()
RebootNT True
End Sub
Private Sub Command3_Click()
ShutDownNT True
End Sub
Private Sub Form_Load()
Command1.Caption = "Log Off NT"
Command2.Caption = "Reboot NT"
Command3.Caption = "Shutdown NT"
End Sub
Спасибо огромное за перевод.
ЧТо спасибо. А как выключить!
Перевожу:
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const TOKEN_ADJUST_PRIVILEGES = &H20
Private Const TOKEN_QUERY = &H8
Private Const SE_PRIVILEGE_ENABLED = &H2
Private Const ANYSIZE_ARRAY = 1
Private Const VER_PLATFORM_WIN32_NT = 2
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
End Type
Type LUID
LowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long
'Detect if the program is running under Windows NT
Public Function IsWinNT() As Boolean
Dim myOS As OSVERSIONINFO
myOS.dwOSVersionInfoSize = Len(myOS)
GetVersionEx myOS
IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function
'set the shut down privilege for the current application
Private Sub EnableShutDown()
Dim hProc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
hProc = GetCurrentProcess()
OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
mPriv.PrivilegeCount = 1
mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
mPriv.Privileges(0).pLuid = mLUID
' enable shutdown privilege for the current application
AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub
' Shut Down NT
Public Sub ShutDownNT(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_SHUTDOWN
If Force Then Flags = Flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx Flags, 0
End Sub
'Restart NT
Public Sub RebootNT(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_REBOOT
If Force Then Flags = Flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx Flags, 0
End Sub
'Log off the current user
Public Sub LogOffNT(Force As Boolean)
Dim ret As Long
Dim Flags As Long
Flags = EWX_LOGOFF
If Force Then Flags = Flags + EWX_FORCE
ExitWindowsEx Flags, 0
End Sub
'In a form
'This project needs a form with three command buttons
Private Sub Command1_Click()
LogOffNT True
End Sub
Private Sub Command2_Click()
RebootNT True
End Sub
Private Sub Command3_Click()
ShutDownNT True
End Sub
Private Sub Form_Load()
Command1.Caption = "Log Off NT"
Command2.Caption = "Reboot NT"
Command3.Caption = "Shutdown NT"
End Sub
ТЫ пробывал в Xp выключить комп?
Код выхода из Windows я знаю.
Ты лутьше скажи как отключить комп натуральным образом.
Ну нажимаю на выключение компа,
а в итоге в конце вылетает табличка -
теперь вы можете выключить комп,
как-будто у меня AT корпус, а не ATX.
Мне надо всё отключить!!! А тут горит монитор и всё такое.
Кстати как ответ об MDI!!,,,??
К сожалению есть такая фишка - табличка будет выскакивать даже если у тебя БП ATX (наверное наследие win98). причем другой предлагаемый код - shell("shutdown -r") тоже приводит к такому же эффекту. Так что больше вариантов я не знаю.
А можно сделать код, который выполняет Ctr+Alt+Del, пауза сек.5 затем переключение раскладки на русскую смоделировать нажатия клавишь
Alt+ш,Alt+ ы.(в Диспетчере задач Windows) что-бы выключить комп.
Но всё-таки в WindowsXp есть прога которая выключает комп. Может как либо её отследить.?
Внимательнее надо быть! Константа на выключение EWX_POWEROFF, а не EWX_SHUTDOWN приведенный мной код на Си прекраснейшим образом выключает компьютер, просто неточность в переводе...
Дык как выключить!?
Где код на Visual BasiC!,!,!,????
А ты на Си не написал.....
Дык как выключить!?
Где код на Visual BasiC!,!,!,????
Код на VB тебе дал товарищ SergeySV, просто найди значение константы EWX_POWEROFF, и используй ее в этом коде в качестве параметра ExitWindowsEx.
Код на VB тебе дал товарищ SergeySV, просто найди значение константы EWX_POWEROFF, и используй ее в этом коде в качестве параметра ExitWindowsEx.
Я просмотрел win32api.txt но не нашёл!
Где искать!,?
Нашел ты почти то же самое, только для удаленного компутера, как я понял у тебя нет определения нужной константы - держи dll там одна процедура без параметров - PowerOff - как подключить думаю догадаешься(например LoadLibrary, GetProcAddres, FreeLibrary), если нет там еще и exe, накрайняк выполнишь через WinExec(не троян);)
Всё супер!!!
Как либо выпутаюсь.
Неужели без dll ни как не льзя...???
Может код EXE покажешь.
Большое тебе спасибо Hearse, А также SergeySV.
Большое тебе спасибо Hearse.
Может код EXE покажешь.
Всегда пожалуйста!
Код exe к сожалению на С++:(
typedef void(*lib_func)(void);
int main()
{
HMODULE hLibrary;
lib_func f;
hLibrary=LoadLibrary("poweroff.dll");
f=(lib_func)GetProcAddress(hLibrary, "PowerOff");
f();
FreeLibrary(hLibrary);
return 0;
}
Код функции PowerOff которая в dll я приводил выше.
Если в VB есть возможность статического линкования кода то lib приложен.
Просто у меня седьмая студия, а в VB7 я понимаю еше меньше чем в VB6(например там нет Type, вместо него Structure, нельзя в структре определять массивы конечного размера и т.д.)
З.Ы. Переходи на С++, и MSDN юзать легче, и ваять проще, IMHO CBuilder6 намного легче VB, хотя сам пишу на MSVC++.
Public Const EWX_POWEROFF = &H8&