i386
Messages postés15Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention13 janvier 2006
-
19 déc. 2005 à 10:30
cs_pompomp
Messages postés21Date d'inscriptionsamedi 28 janvier 2006StatutMembreDernière intervention21 août 2008
-
30 janv. 2006 à 00:00
Bonjour,
je voudrais faire un petit programme en VB6 afin d'éteindre mon PC apres un délai saisie par l'utilisateur (notamment moi !!!)
donc tout simplement j'ai une textBox pour saisir le délai et un bouton pour le lancer.
code : Private sub command_click()
delai = val(text1.text)
shell ("shutdown -s -f -t " & "delai")
end sub
mais il me renvoie l'erreur d'execution '424' : un objet est requis
Je ne vois pas du tout pourquoi, pourriez vous m'aider.
i386
Messages postés15Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention13 janvier 2006 19 déc. 2005 à 18:08
ca y est j'ai trouvé !!!!!!!!!!!!!!!
c'est tout bête.
Voici la source en une ligne qui marche chez moi (windows XP pro et home):
Private Sub Command1_Click()
Shell ("shutdown -s -f -t " & Val(Text1.Text))
End
End Sub
Juste besoin d'une textbox et d'un bouton !!! et deux lignes de code !!!!
J'espère qu'il pourra servir à d'autres (j'avais pas trouver de code ou des bien plus compliqué pour cette action toute bête !!!).
Merci à iloveprog pour les guillemets et à violent_ken.
Salut
ps : ah enfin, une journée pour un petit truc de rien du tout mais qui a payé, je vais pouvoir mater des films sans avoir besoin de me relever pour éteindre le PC ou a tapé une ligne de code sous l'invite de commande.
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 19 déc. 2005 à 11:11
Violent Ken
Salut. Je vais être franc, la méthode de "shell(shutdown)...." et plein d'autres n'ont JAMAIS marché chez moi non plus. J'avais tout essayé (sous XP) et rien n'a marché ... sauf http://www.vbfrance.com/code.aspx?id=2397. Là c'est nickel. Je te coneille d'utiliser cette source aussi !
@+
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 19 déc. 2005 à 11:25
Violent Ken
Salut. En fait je viens de me rendre compte que la source n'existe plus ? Il y a les commentaires, mais pas de code.
Donc voilà le code, littéralement tiré de la source que je t'ai conseillé : (à mettre dans un MODULE)
' déclarations des constantes pour l'api (c po moi ki les définis !!! lol demandé o kro$)
Private Const EWX_LOGOFF = 0
Private Const EWX_SHUTDOWN = 1
Private Const EWX_REBOOT = 2
Private Const EWX_FORCE = 4
Private Const EWX_POWERDOWN = 8
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
' structure pour la version de l'OS
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
'bon alors ici on déclare les fonctions API Win32 (cf. API Win32)
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
' fonction ki renvoi si l'OS est de type NT (interne)
Public Function IsWinNT() As Boolean
Dim myOS As OSVERSIONINFO
myOS.dwOSVersionInfoSize = Len(myOS)
GetVersionEx myOSIsWinNT (myOS.dwPlatformId VER_PLATFORM_WIN32_NT)
End Function
' fonction qui active le ShutDown, au cas ou le système serais de type NT
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
AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub
' fonction qui éteint le PC (Force=true oblige le traitement)
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
' fonction qui éteint totalement la tour (Force=true oblige le traitement)
Public Sub PowerDownNT(Force As Boolean)
Dim ret As Long
Dim FLAGS As Long
FLAGS = EWX_POWERDOWN
If Force Then FLAGS = FLAGS + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx FLAGS, 0
End Sub
' fonction qui fait rebooter l'OS (Force=true oblige le traitement)
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
' fonction qui délogue l'user (Force=true oblige le traitement)
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
Voilà ! Pour l'utilisation, tu fait un truc du genre :
Private Sub Form_Load()
timer1.enabled=false
end sub
Private sub Eteindre_PC()
delai = val(text1.text)
timer1.enabled=true
timer1.interval=delai ' donc au maximum le temps géré par un timer ! Attention !
'si tu veux éteindre à une HEURE précise, utilise Date$ et Time$
PowerDownNT(true)
end sub
end sub
Voilà !!
@+
Vous n’avez pas trouvé la réponse que vous recherchez ?
violent_ken
Messages postés1812Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention26 octobre 20102 19 déc. 2005 à 12:13
Violent Ken
Tu n'est pas obligé de tout garder dans le programme. Si tu ne veux qu'ETEINDRE sous WINDOWS XP, tu peux simplement utiliser cette partie :
Private Const EWX_SHUTDOWN = 1
Private Const EWX_FORCE = 4
Private Const EWX_POWERDOWN = 8
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
' fonction qui éteint le PC (Force=true oblige le traitement)
Public Sub ShutDownNT(Force As Boolean)
Dim ret As Long
Dim FLAGS As Long
FLAGS = EWX_SHUTDOWN
If Force Then FLAGS = FLAGS + EWX_FORCE
ExitWindowsEx FLAGS, 0
End Sub
' fonction qui éteint totalement la tour (Force=true oblige le traitement)
Public Sub PowerDownNT(Force As Boolean)
Dim ret As Long
Dim FLAGS As Long
FLAGS = EWX_POWERDOWN
If Force Then FLAGS = FLAGS + EWX_FORCE
ExitWindowsEx FLAGS, 0
End Sub
Voilà. Le programme gérais en fait aussi le reboot et le deloguage, mais aussi supportait différent OS (XP,NT,2000...)
Donc le voilà épuré pour éteindre windows XP.
Je n'ai pas vraiment retesté, mais çà devrais marcher sans soucis !
Tu peux utiliser aussi bien PowerDownNT que ShutDownNT, la différence est que sur certain PC, seul PowerDownNT éteind totalement le PC.
Voilà !!
@+
i386
Messages postés15Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention13 janvier 2006 22 déc. 2005 à 16:45
Salut,
Oui c'est sur que le code de Violent_ken marche à tous les coups, mais pour le comprendre faut pas etre un débutant (comme moi !!!).
En tout cas les deux lignes que j'ai écrite marche à chaque fois chez moi, ce qui me satisfait pour l'instant ...
i386
Messages postés15Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention13 janvier 2006 29 janv. 2006 à 23:04
Salut PomPom,
Pour ma solution il n'y a pas de timer, en fait dans une texte box tu précise le temps en seconde et quand tu appui sur le bouton cmdOk, ca passe à l'invite de commande de windows le code "shutdown -s -f -t" .le temps précisé dans la texte box se met derrière le t de la commande (car la temporisation par défaut est de 20s)
Voila, je ne sais pas si j'ai été assez clair.
De plus, la solution de ViloentKen marchera partout car elle utilise des api windows, mais bon la mienne marche sur XP home & Pro au moins (en tout cas chez moi).
cs_pompomp
Messages postés21Date d'inscriptionsamedi 28 janvier 2006StatutMembreDernière intervention21 août 2008 30 janv. 2006 à 00:00
moi, j'aimerais que le pc s'eteigne à la fin du décompte du timer. Je n'ai donc pas de valeur à préciser derrière le "shutdown" et c'est ce que j'ai fait (et je pense que cela devrait etre bon).
Quand j'utilise un point d'arrêt, je remarque que la fonction EteindrePc() est bien prise en compte, que FLAGS 1 (donc à Shutdown, sachant que j'ai enlevé la ligne FLAGS FLAGS + EWX_FORCE parce que sinon, je trouvais Flags = 5 et je ne sais pas à quelle constante 5 correspond).
Ensuite, quand je laisse le pointeur sur ExitWindowsEx, j'obtiens le message : "Declare Ansi function ExitWindowsEx lib "user32" (
uFlags As Integer, ByVal dwReserved As Integer)"