Extinction PC XP

Résolu
i386 Messages postés 15 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 13 janvier 2006 - 19 déc. 2005 à 10:30
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 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.

Merci

13 réponses

i386 Messages postés 15 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 13 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.
3
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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 !
@+
0
i386 Messages postés 15 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 13 janvier 2006
19 déc. 2005 à 11:23
Merci Violent_Ken

Mais a part des commentaires, j'ai pas trouvé de source ...
Pourrais tu m'aider un peu plus.

Merci encore .
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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à !!
@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
i386 Messages postés 15 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 13 janvier 2006
19 déc. 2005 à 12:03
Merci Viloent_ken,

ouhlala, ca va etre tendu de comprendre tout ca pour un débutant comme moi, je pensais qu'en deux lignes, c'était jouable, mais non ...

Va falloir que j'apprenne ce qu'est une API win32 ... c'est pas gagné

merci encore !!!
0
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
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à !!
@+
0
iloveprog Messages postés 16 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 4 novembre 2009
19 déc. 2005 à 14:30
Je ne suis pas sur que ca marche mais remplace ton code par :

Private sub command_click()
delai = val(text1.text)
shell ("shutdown -s -f -t " & delai)
end sub


delai ne doit pas etre entre guillemet ; c'est une valeur pas une phrase
0
iloveprog Messages postés 16 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 4 novembre 2009
19 déc. 2005 à 14:30
Je ne suis pas sur que ca marche mais remplace ton code par :

Private sub command_click()
delai = val(text1.text)
shell ("shutdown -s -f -t " & delai)
end sub


delai ne doit pas etre entre guillemet ; c'est une valeur pas une phrase
0
cs_mateo1975 Messages postés 5 Date d'inscription jeudi 13 février 2003 Statut Membre Dernière intervention 22 décembre 2005
22 déc. 2005 à 14:32
comme violantken le shell shutdown ne marche pas a tous les coups chez moi

par contre l'utilisation de l'api ExitWindowsEx c'est du 100 %
0
i386 Messages postés 15 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 13 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 ...

Au revoir
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 août 2008
29 janv. 2006 à 22:30
bonjour,
je voualis moi aussi faire un petit utilitaire pour éteindre l'ordi, et j'ai donc essayé de suivre vos exemples comme suit :



Private
Sub Timer1_Tick(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Timer1.Tick


EteindrePC(
True)



End
Sub

/*et dans un module*/


Private
Declare
Function ExitWindowsEx
Lib "user32" (
ByVal uFlags
As
Integer,
ByVal dwReserved
As
Integer)
As
Boolean



Private
Const EWX_SHUTDOWN
As
Integer = 1

Private
Const EWX_FORCE
As
Integer = 4

Private
Const EWX_POWERDOWN
As
Integer = 8



Public
Sub EteindrePC(
ByVal Force
As
Boolean)

Dim FLAGS
As
Integer
FLAGS = EWX_SHUTDOWN

If Force
Then FLAGS = FLAGS + EWX_FORCE
ExitWindowsEx(FLAGS, 0)

End
Sub

j'avais aussi essayé en plaçant directement dans la fonction du timer :

Shell ("shutdown -s -f -t ")

mais rien de tout ça ne marche.

Par contre, j'avais utilisé la première méthode avec la constante EWX_LOGOFF, et là pas de pb.
Si vous avez une solution à mon problème, merci.
0
i386 Messages postés 15 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 13 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).

Bon courrage, tiens nous au courrant.

Salut
0
cs_pompomp Messages postés 21 Date d'inscription samedi 28 janvier 2006 Statut Membre Dernière intervention 21 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)"

Voilà, merci pour votre aide
0
Rejoignez-nous