PDA

Visualizza versione completa : VB e OS


wilhelm
29-01-2003, 19.15.32
Chi saprebbe dirmi come spegnere il computer con VB? Mi serve ad uso personale su un computer con scheda madre ATX.
Grazie!

LoryOne
30-01-2003, 15.14.07
Cosa intendi con spegnere il computer ?

1) La normale chiusura da Windows
2) Lo spegnimento con l'apposito pulsante

Per il primo c'è un'apposita funzione API chiamata ExitWindowsEX.
Se ricerchi un po su Internet ci sono già dei software in grado di fare quello che chiedi e non fanno altro che richiamare la funzione sopracitata.
Alcuni comandano lo spegnimento di un PC in rete ma anche qui nulla di eccezionale.C'è la API anche li.:) :) :)

P8257 WebMaster
30-01-2003, 17.33.51
.. per spegnerlo col pulsante, invece l'API è:

AlzatieMettiIlDitinoSulPulsantePremendoloForte

:D:D:D



Bye :cool:

LoryOne
30-01-2003, 17.41.05
Già (Y) :D :D :D

wilhelm
30-01-2003, 21.11.03
Grazie, proverò.

Sergio Neddi
30-01-2003, 21.32.07
Tanto per fare un esempio, per semplificare la procedura di spegnimento alla bambina ho creato un collegamento sul desktop con questa linea di comando: "C:\WINDOWS\rundll32.exe" shell32,SHExitWindowsEx 1

Il sistema è Windows 98 SE.

Sanduleak
31-01-2003, 01.17.17
se può interessare, su Windows 2000/XP, nella DLL powrprof.dll c'è la seguente API:

SetSuspendState()
indovinate a ke serve?? ;)

LoryOne
31-01-2003, 09.59.04
Originariamente inviato da Sergio Neddi
Tanto per fare un esempio, per semplificare la procedura di spegnimento alla bambina ho creato un collegamento sul desktop con questa linea di comando: "C:\WINDOWS\rundll32.exe" shell32,SHExitWindowsEx 1

Il sistema è Windows 98 SE.

Ottima idea quella del Neddi.
A questo punto ti basta usare Shell e richiamare quel link sul Desktop, oppure Shell "C:\WINDOWS\rundll32.exe" shell32,SHExitWindowsEx 1",[vedi tu]

(Y) (Y) (Y)

wilhelm
31-01-2003, 14.12.59
Non sono esperto in programmazione e provando con ExitWIndowsEx esce solo dalla sessione. Quello che mi interessa è dargli un'ora di spegnimento.

LoryOne
31-01-2003, 17.32.30
...non parlare di esperti, per piacere.

L'utilizzo delle API richiede una buona conoscenza di come funzioni Windows ed il ricorso al loro utilizzo non è certo adatto a chi ha poca esperienza in fatto di programmazione.

Ciò non vuol dire che tu non possa utilizzarle nella maniera più adatta alle tue esigenze.
Come ben sai, Windows è basato su librerie dinamiche, ossia su chiamate a funzioni più o meno complesse che vengono eseguite qualora ce ne sia bisogno (Tralasciando di caricare in memoria porzioni di codice compilato inutile e poco consono all' operazione da eseguire)

Le librerie dinamiche che consentono a Windows di funzionare sono molteplici e suddivise in base alla loro specializzazione.
Il cuore o kernel del sistema operativo è kernel32.dll ma vi è anche gdi32.dll che si occupa di gestire l'interfaccia grafica, per esempio.(A tal proposito guardati quante ce ne sono in \WINDOWS\SYSTEM, senza contare che i programmi che hai installato oltre a Windows ne avranno immesse altre.)

I programmatori di Microsoft si sono creati tutta una serie di funzioni specializzate nell'eseguire determinate operazioni, suddividendole in più librerie, dando loro un nome e la possibilità di interfacciarsi con esse, previo dichiarazione e tipologia dei parametri da fornire per il loro corretto funzionamento.
NB: Molte API non sono presenti in Windows 98 ma in 2000 ed XP si e viceversa.
Se fai uso delle API ricorda sempre di tener presente su quale sistema operativo il tuo programma deve funzionare !!!!

Alcuni parametri sono già stati definiti da Microsoft, la quale ha dato loro un nome univoco ed un valore numerico.
Se questo valore numerico viene passato come giusto parametro ad una funzione , al variare di tale numero sarà differente il risultato finale che la chiamata alla funzione genererà.

ExitWindowsEX viene dichiarato in questo modo:
Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long (In VB, ovviamente)

Da qui si capisce che la funzione in causa si trova nella libreria dinamica user32.dll, che restituisce un valore numerico intero lungo e che ha bisogno di due parametri entrambi di tipo intero lungo.
Ora poni attenzione al parametro uFlags.
uFlags può avere diversi valori, ossia:

EWX_FORCE
Forces processes to terminate. When this flag is set, Windows does not send the messages WM_QUERYENDSESSION and WM_ENDSESSION to the applications currently running in the system. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
EWX_LOGOFF
Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.
EWX_POWEROFF
Shuts down the system and turns off the power. The system must support the power-off feature.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.
EWX_REBOOT
Shuts down the system and then restarts the system.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.
EWX_SHUTDOWN
Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.

dwReserved lascialo a 0, tanto non serve a nulla.

Qui di valori a dire il vero non se ne parla, più che altro sono nomi.
Già, ma solo perchè devi vedere in win32api.txt (che sicuramente hai) quali valori mamma Microsoft ha specificato per EWX_FORCE,EWX_LOGOFF,EWX_POWEROFF, e via discorrendo

Detto questo mi pare che tu abbia bisogno di spegnere il PC per un' oretta, dico bene ?
Io dico che sicuramente ce la fai, tu che dici ?

Ps: Vorrai scusarmi se ho cercato di semplificare il più possibile ma la materia è vastissima e c'è poco spazio per essere più preciso.
Ti lascio con una considerazione...A volte rimango a bocca aperta quando vedo certi software che fanno cose strabilianti sul mio monitor. Poi mi accorgo che la gente che li ha programmati altro non ha fatto che perdere un po di tempo a studiarsi come richiamare le API, senza scrivere una riga di codice in più...Strana la vita, eh ?

wilhelm
01-02-2003, 12.54.27
Grazie per la risposta esauriente.

wilhelm
06-02-2003, 19.56.37
Grazie per il prezioso aiuto e l'incoraggiamento, ci sono riuscito!
Alla prossima!

wilhelm
31-05-2003, 14.05.05
Originariamente inviato da LoryOne
...non parlare di esperti, per piacere.

L'utilizzo delle API richiede una buona conoscenza di come funzioni Windows ed il ricorso al loro utilizzo non è certo adatto a chi ha poca esperienza in fatto di programmazione.

Ciò non vuol dire che tu non possa utilizzarle nella maniera più adatta alle tue esigenze.
Come ben sai, Windows è basato su librerie dinamiche, ossia su chiamate a funzioni più o meno complesse che vengono eseguite qualora ce ne sia bisogno (Tralasciando di caricare in memoria porzioni di codice compilato inutile e poco consono all' operazione da eseguire)

Le librerie dinamiche che consentono a Windows di funzionare sono molteplici e suddivise in base alla loro specializzazione.
Il cuore o kernel del sistema operativo è kernel32.dll ma vi è anche gdi32.dll che si occupa di gestire l'interfaccia grafica, per esempio.(A tal proposito guardati quante ce ne sono in \WINDOWS\SYSTEM, senza contare che i programmi che hai installato oltre a Windows ne avranno immesse altre.)

I programmatori di Microsoft si sono creati tutta una serie di funzioni specializzate nell'eseguire determinate operazioni, suddividendole in più librerie, dando loro un nome e la possibilità di interfacciarsi con esse, previo dichiarazione e tipologia dei parametri da fornire per il loro corretto funzionamento.
NB: Molte API non sono presenti in Windows 98 ma in 2000 ed XP si e viceversa.
Se fai uso delle API ricorda sempre di tener presente su quale sistema operativo il tuo programma deve funzionare !!!!

Alcuni parametri sono già stati definiti da Microsoft, la quale ha dato loro un nome univoco ed un valore numerico.
Se questo valore numerico viene passato come giusto parametro ad una funzione , al variare di tale numero sarà differente il risultato finale che la chiamata alla funzione genererà.

ExitWindowsEX viene dichiarato in questo modo:
Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long (In VB, ovviamente)

Da qui si capisce che la funzione in causa si trova nella libreria dinamica user32.dll, che restituisce un valore numerico intero lungo e che ha bisogno di due parametri entrambi di tipo intero lungo.
Ora poni attenzione al parametro uFlags.
uFlags può avere diversi valori, ossia:

EWX_FORCE
Forces processes to terminate. When this flag is set, Windows does not send the messages WM_QUERYENDSESSION and WM_ENDSESSION to the applications currently running in the system. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
EWX_LOGOFF
Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.
EWX_POWEROFF
Shuts down the system and turns off the power. The system must support the power-off feature.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.
EWX_REBOOT
Shuts down the system and then restarts the system.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.
EWX_SHUTDOWN
Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section.
Windows 95: Security privileges are not supported or required.

dwReserved lascialo a 0, tanto non serve a nulla.

Qui di valori a dire il vero non se ne parla, più che altro sono nomi.
Già, ma solo perchè devi vedere in win32api.txt (che sicuramente hai) quali valori mamma Microsoft ha specificato per EWX_FORCE,EWX_LOGOFF,EWX_POWEROFF, e via discorrendo

Detto questo mi pare che tu abbia bisogno di spegnere il PC per un' oretta, dico bene ?
Io dico che sicuramente ce la fai, tu che dici ?

Ps: Vorrai scusarmi se ho cercato di semplificare il più possibile ma la materia è vastissima e c'è poco spazio per essere più preciso.
Ti lascio con una considerazione...A volte rimango a bocca aperta quando vedo certi software che fanno cose strabilianti sul mio monitor. Poi mi accorgo che la gente che li ha programmati altro non ha fatto che perdere un po di tempo a studiarsi come richiamare le API, senza scrivere una riga di codice in più...Strana la vita, eh ?

In che libro posso approfondire tutta sta roba?

LoryOne
01-06-2003, 11.15.49
Devi acquistare la bibbia :D delle API, come ho fatto io.
Il libro (1540 pagine) :eek: si intitola:


"Visual Basic Programmer's guide to the Win32 API"


Sebbene siano 1540 pagine, tratta SOLO le principali librerie.
...è tutto in inglese (In italiano non l'ho trovato ma per me fa lo stesso.)

Buona lettura :)

Ciao.

wilhelm
02-06-2003, 15.49.26
Grazie, quest'estate sotto l'ombrellone so cosa portarmi!

LoryOne
02-06-2003, 17.25.22
Te sei fuori di testa :eek: :eek:

Dai retta a me, quest'estate sotto l'ombrellone portati la sgnacchera (Y), non i libri ;)

wilhelm
02-06-2003, 18.37.20
...

LoryOne
03-06-2003, 10.34.30
:D :)

elbarto
05-06-2003, 02.08.43
lol

wilhelm
26-11-2004, 17.45.00
Scusate, ma a volte ritorno...
L'API (ExitWindowsEx) che funzionava su WinME non funziona più su Win2K, qui infatti si limita a chiudere l'applicazione invece del SO.
Non ho toccato niente rispetto a quello che già c'era prima...
Come fare?

LoryOne
26-11-2004, 17.59.56
Lo so cambia tutto.
Cerca di reperire informazioni su quest'altra API:
InitiateSystemShutdown
Puoi comandare anche lo spegnimento di PC in rete :)

Ps: Inutile dire che non funziona su 9x/Me

wilhelm
26-11-2004, 18.23.39
Grazie, adesso guardo!

wilhelm
26-11-2004, 18.46.15
Ho trovato le informazioni, ma resta il computer acceso con la schermata "Adesso è possibile spegnere il computer".

ceccus
26-11-2004, 21.24.56
Salve,
Ti posto il codice che devi scrivere...tale codice è tratto dal mio Software TqM (Task quasi Manager)

Public Const EWX_FORCE = 4
Public Const EWX_LOGOFF = 0
Public Const EWX_REBOOT = 2
Public Const EWX_SHUTDOWN = 1

Private Sub CmdShut_Click()
Dim Ret

Ret = MsgBox("Si è SICURI di voler Terminare Windows ?" & vbCrLf & _
"Il Sistema eseguirà uno Stop Forzato." & vbCrLf & _
"TUTTE le Applicazioni in esecuzione verranno TERMINATE " & vbCrLf & _
"con Possibilità di Perdita Dati....." & vbCrLf & vbCrLf & _
"Si vuole Continuare ??", vbExclamation + vbOKCancel, "Task (quasi) Manager")
If Ret = vbOK Then
If GTipoPiattaforma = 1 Then
Call ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, &HFFFF)
Else
Call EnableShutDown
Call ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, &HFFFF)
End If
End If
End Sub

Public Sub EnableShutDown()
Dim Hproc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
Dim lngResult As Long

Hproc = GetCurrentProcess()
lngResult = OpenProcessToken(Hproc, _
TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, _
hToken)
lngResult = LookupPrivilegeValue("", _
"SeShutdownPrivilege", _
mLUID)

With mPriv
.PrivilegeCount = 1
.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
.Privileges(0).pLuid = mLUID
End With

lngResult = AdjustTokenPrivileges(hToken, _
False, _
mPriv, _
4 + (12 * mPriv.PrivilegeCount), _
mNewPriv, _
4 + (12 * mNewPriv.PrivilegeCount))
End Sub

Il fulcro del discorso è la EnableShutdown....ti appriopri dei privilegi per poter eseguire lo Shutdown del sistema su Kernel NT (win 2000/XP/2003)
Ti garantisco che tale software è in grado di spengere la macchina.....il ramo che ti interessa è quello relatico a Gpiattaforma > 1 (kernel NT)
Se hai problemi, non hai che da chiedere....

Ciao !!

wilhelm
26-11-2004, 22.42.06
Grazie, però ancora non ci sono perchè mi manca la definizione dei tipi LUID e TOKEN_PRIVILEGES.
Inoltre, se hai un po' di tempo, mi spiegheresti come funziona tutto quello che hai postato?
Mi piacerebbe sapere perchè fa quello che fa.
Grazie.

ceccus
26-11-2004, 22.47.06
Salve,
Allora, ecco le difinizioni mancanti :

Public Const TOKEN_ADJUST_PRIVILEGES As Long = &H20
Public Const TOKEN_QUERY As Long = &H8
Public Const SE_PRIVILEGE_ENABLED = &H2
Public Const SE_PRIVILEGE_ENABLED_BY_DEFAULT = &H1

Public Type LUID
LowPart As Long
HighPart As Long
End Type

Public Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type

Public Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(1) As LUID_AND_ATTRIBUTES 'we only want one privilage
End Type

Public Type LARGE_INTEGER
LowPart As Long
HighPart As Long
End Type

Public Declare Function OpenProcessToken _
Lib "advapi32" _
(ByVal ProcessHandle As Long, _
ByVal DesiredAccess As Long, _
TokenHandle As Long) _
As Long

Public Declare Function LookupPrivilegeValue _
Lib "advapi32" _
Alias "LookupPrivilegeValueA" _
(ByVal lpSystemName As String, _
ByVal lpName As String, _
lpLuid As LUID) _
As Long

Public Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (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

E queste sono un po' di dichiarative di API da includere...

Questo codice, fa quello che deve fare, perchè nei Kernel NT, NON è consentito alle applicazioni di eseguire lo Shutdown del sistema....a meno che le applicazioni non si appriprino dei privilegi opportuni per poterlo fare....la routine EnabledShutdown fa proprio questo....e ti posso assicurare che lo Shutdown è perentorio....

Ciao !!

P.S. : puoi provare questo codice scaricandoti il TqM da questo link : http://pctrio.com/Software1.asp

wilhelm
27-11-2004, 08.10.54
Ho preso il codice, grazie, e inserito le opportune dichiarazioni. Ancora però, al momento di eseguire

Originariamente inviato da ceccus
Public Sub EnableShutDown()
Dim Hproc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
Dim lngResult As Long

Hproc = GetCurrentProcess()
lngResult = OpenProcessToken(Hproc, _
TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, _
hToken)
lngResult = LookupPrivilegeValue("", _
"SeShutdownPrivilege", _
mLUID)

With mPriv
.PrivilegeCount = 1
.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
.Privileges(0).pLuid = mLUID
End With

lngResult = AdjustTokenPrivileges(hToken, _
False, _
mPriv, _
4 + (12 * mPriv.PrivilegeCount), _
mNewPriv, _
4 + (12 * mNewPriv.PrivilegeCount))
End Sub

mi dà un errore perchè il terzo argomento di LookupPrivilegeValue è ti tipo LARGE_INTEGER nella dichiarazione, ma ti tipo LUID nela chiamata.
C'è qualcosa da modificare?

wilhelm
27-11-2004, 08.40.00
Ok, era una cosa da niente.
Piuttosto: ancora non mi toglie corrente alla macchina.
Non ho idea di cosa manchi...
Grazie oper l'aiuto.

ceccus
27-11-2004, 08.50.22
Salve,
Se non ti toglie corrente al PC, non dipende dal codice...ma dal fatto che non è abilitato il livello S3 da bios....Controlla che l' ACPI sia regolarmente abilitato a livello di S.O. .... e controlla pure il bios...magari aggiornalo....

Ciao !!

P.S. : se non lo hai ancora provato, prova TqM...credo che non rimmarrai deluso...( http://www.pctrio.com/Software1.asp )il codice postato deriva da lì... :)

wilhelm
27-11-2004, 10.16.50
Originariamente inviato da ceccus
Salve,
Se non ti toglie corrente al PC, non dipende dal codice...ma dal fatto che non è abilitato il livello S3 da bios....Controlla che l' ACPI sia regolarmente abilitato a livello di S.O. .... e controlla pure il bios...magari aggiornalo....


Grazie, guarderò.
Quello che mi lascia perplesso è che sulla stessa macchina, il programma che spegne WinME toglie anche la corrente, con Win2000 no.
Grazie ancora!

LoryOne
27-11-2004, 16.44.24
EWX_POWEROFF=&H8
Shuts down the system and turns off the power. The system must support the power-off feature.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege

Ottenere i privilegi sui token è prioritario anche se utilizzi la funzione InitiateSystemShutdown (da me preferita ad ExitWindowsEx) che è tipica dei kernel NT e successivi. :)

wilhelm
27-11-2004, 19.59.28
Infatti adesso funziona alla perfezione. Grazie a tutti.

ceccus
28-11-2004, 19.01.06
Salve,
Prego...ci mancherebbe

Ciao !