Paulo Nobre Postado Junho 20, 2004 Denunciar Share Postado Junho 20, 2004 Tenho um alarme simples que usa a função API do windowsExitWindowsExPara desligar o computador na hora estabelecida uso a constante EWX_SHUTDOWN = 1, da seguinte maneira Dim Dummy as longDummy = ExitWindowsEx(1,0)A função API é:Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Longdeclarada no option explicit do form que faz sua chamada.O problema é que funciona no Win98 e Me, mas não funciona no XP.Alguém saberia dizer por que?Obrigado pela atençãoPaulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 20, 2004 Autor Denunciar Share Postado Junho 20, 2004 Tentei usar ExitWindowsEx(EWX_Force,0), mas desta forma ele não desliga, apenas aparece a tela para reiniciar com logon.Foi tentada também uma sugestão de um colega de outro forum, que seria combinar 1 + EWX_Force mas nada acontece. Alguém poderia ajudar?Existe alguma outra API para desligar?ObrigadoPaulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 24, 2004 Autor Denunciar Share Postado Junho 24, 2004 Para todos que se dispuseram a ler ou tentar ajudar, consegui através de um colaborador(T@Z) de um outro forum este código:esta função foi retirada do programa "API-Guide" disponivel para download em "http://www.allapi.net"(palavras dele)'Insira isto em um móduloPrivate Const EWX_LOGOFF = 0Private Const EWX_SHUTDOWN = 1Private Const EWX_REBOOT = 2Private Const EWX_FORCE = 4Private Const TOKEN_ADJUST_PRIVILEGES = &H20Private Const TOKEN_QUERY = &H8Private Const SE_PRIVILEGE_ENABLED = &H2Private Const ANYSIZE_ARRAY = 1Private Const VER_PLATFORM_WIN32_NT = 2Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128End TypeType LUID LowPart As Long HighPart As LongEnd TypeType LUID_AND_ATTRIBUTES pLuid As LUID Attributes As LongEnd TypeType TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTESEnd TypePrivate Declare Function GetCurrentProcess Lib "kernel32" () As LongPrivate Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As LongPrivate Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As LongPrivate 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 LongPrivate Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As LongPrivate Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef lpVersionInformation As OSVERSIONINFO) As Long'Detect if the program is running under Windows NTPublic 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 applicationPrivate 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 NTPublic 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, 0End Sub'Restart NTPublic 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, 0End Sub'Log off the current userPublic 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, 0End Subcrie um formulário com 3 botõesPrivate Sub Command1_Click() LogOffNT TrueEnd SubPrivate Sub Command2_Click() RebootNT TrueEnd SubPrivate Sub Command3_Click() ShutDownNT TrueEnd SubPrivate Sub Form_Load() 'KPD-Team 2000 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net Command1.Caption = "Log Off NT" Command2.Caption = "Reboot NT" Command3.Caption = "Shutdown NT"End Subtive que adaptar o código no shutdown, colocando flag = EWX_POWEROFF e incluindo const = EWX_POWEROFF = 8, pois se não fizesse isto não desligava direto e sim aparecia aquela tela final dizendo que agora o computador já pode ser desligado.Por outro lado veja como programação tem detalhes e é dificil(pra mim que sou leigo-sou professor de matemática e uso prá brincar)nos computadores "caseiros"(sem senha) tudo bem,mas, levei para testar na escola onde trabalho que tem Windows 98, pois estava cabreiro com o fato do código fazer o teste em cima do NT.Como os computadores tem senha (acho que este é o problema), na hora programada do alarme para desligar, ao invés de desligar,aparecia a caixa da senha para entrar no sitema, mas não desligava e ainda para piorar o programa desaparecia da tela e ficava em segundo plano.ou seja o problema continuaobrigado a quem se dispuser a ajudarPaulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Junho 25, 2004 Denunciar Share Postado Junho 25, 2004 Para todos que se dispuseram a ler ou tentar ajudar, consegui através de um colaborador(T@Z) de um outro forum este código:Valeu Paulo Nobre por ter colocado o código aí para nós...Meio complicado mas vou ver no que posso te ajudar Abraços,William Rodrigues Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 26, 2004 Autor Denunciar Share Postado Junho 26, 2004 Obrigado a você, William, pela gentileza de sua atenção.Paulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Junho 29, 2004 Denunciar Share Postado Junho 29, 2004 Obrigado a você, William, pela gentileza de sua atenção.Imagina brother...Vou estar migrando para o XP hoje e verei no que posso te ajudar Abraços,William Rodrigues Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest - Ricardo - Postado Dezembro 6, 2005 Denunciar Share Postado Dezembro 6, 2005 Usem a função do shell: C:\WINDOWS\RUNDLL.EXE USER.EXE,EXITWINDOWS. ricardomada@pop.com.br Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
Tenho um alarme simples que usa a função API do windows
ExitWindowsEx
Para desligar o computador na hora estabelecida uso a constante EWX_SHUTDOWN = 1, da seguinte maneira
Dim Dummy as long
Dummy = ExitWindowsEx(1,0)
A função API é:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
declarada no option explicit do form que faz sua chamada.
O problema é que funciona no Win98 e Me, mas não funciona no XP.
Alguém saberia dizer por que?
Obrigado pela atenção
Paulo Nobre
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.