PDA

Visualizza la versione completa : [C] Spegere e Fare il Reboot a Windows XP


nightfall
15-02-2004, 19:34
Sto' facendo un Programma Client Server per i miei PC
Per non passare da un PC all'altro avevo pensato di fare un programmino che pensi a spegnere uno dei due PC...

La Comunicazione Tra i due PC funziona solo che non so' Come si fa' a spegere quello con XP

(Uno ha il 98 l'altro L'XP)

Per il 98 Uso :
c:\\windows\\rundll.exe user.exe, exitwindows

richiamato con system();

ma per xp non funziona...

Johnny_Depp
15-02-2004, 21:16
Hai XP?! allora apri:

Guida in linea di windows... [focus/mouse sul desktop, premi F1]
ricerca con chiave: "shutdown"

leggi tutte le possibili combinazioni di parametri... e passa il
comando a system();

system("shutdown -f -r");

oppure... ci sono le API di windows:


#include <windows.h>

BOOL MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Get a token for this process.

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );

// Get the LUID for the shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get the shutdown privilege for this process.

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
return FALSE;

// Shut down the system and force all applications to close.

if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0))
return FALSE;

return TRUE;
}

int main()
{
MySystemShutdown();
...
...

internet
15-02-2004, 21:17
Originariamente inviato da nightfall
Sto' facendo un Programma Client Server per i miei PC
Per non passare da un PC all'altro avevo pensato di fare un programmino che pensi a spegnere uno dei due PC...

La Comunicazione Tra i due PC funziona solo che non so' Come si fa' a spegere quello con XP


Questa funzione che segue funziona solo su Win2k/XP/NT

InitiateSystemShutdown

se non hai MSDN su CD, troverai qui info su come utilizzarla
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/initiatesystemshutdown.asp

kNemo
02-03-2004, 20:01
Io sto' facendo una cosa simile a quella di nightfall...
solo che quando spengo il win98 mi dice...

"C'e' un altro utente collegato... Sicure di voler arrestare il sistema SI | No"...

(Il Messaggio e' una cosa simile :D )

Io Dovrei dare invio o cliccare su SI...
Solo che per fare questo devo fare le scale... :D

Come posso fare a dare il comando dall'altro PC ???

internet
02-03-2004, 20:55
E' lo stesso motivo per cui ho desistito anch'io, infatti su win98 non ho trovato il modo di non far comparire quel messagebox. Forse modificando il registro ... oppure con SendMessage

kNemo
02-03-2004, 21:09
Cos'e' sendMessage ???

internet
02-03-2004, 21:18
Originariamente inviato da kNemo
Cos'e' SendMessage ???

serve per spedire messaggi alle finestre, in questo caso il client dovrebbe spedire un WM_KEYDOWN sul bottone SI della finestra titolata "C' un altro utente collegato...".

SendMessage(HandleFinestra, WM_KEYDOWN, 0, VK_RETURN);

http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/sendmessage.asp

in pratica ogni oggetto (finestre ecc...) sono gestiti tramite messaggi (o eventi) di vario genere, con SendMessage possibile inviare dei messaggi apposti (ad esempio la pressione del tasto invio tramite il messaggio WM_KEYDOWN)

WM = Window Message, perch ci sono anche messaggi che non si applicano alle finestre

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/MessagesandMessageQueues/AboutMessagesandMessageQueues.asp

pensandoci bene forse meglio provare con SendInput

kNemo
03-03-2004, 16:41
"SendInput" Sarebbe ??? :D

I'mtheleader
03-03-2004, 20:39
Quando compare il messaggio basta che gli dici di fare una SendKeys con lo invio cos come se tu salissi le scale per dare invio.. :adhone:

Se nn funge invio prova spazio..

Il sendkeys una funzione e invia un carattere ad una finestra attiva.... :ciauz: :ciauz:

I'mtheleader
03-03-2004, 20:44
A mi sono dimenticato una cosa...

Per far sto programmino usa Visual basic dato che la sendkeys una funzione di Visual...

Basta che fai un programmino in visual che gira in background ed interviene appena si accorge che stata aperta una finestra con il titolo della finestra che chiede il si per lo spegnimento ed fatta...

Ciao ciao :ciauz:

Loading