Intercepter et annuler un shutdown sous seven

arnahel Messages postés 2 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 4 juin 2010 - 3 juin 2010 à 10:37
arnahel Messages postés 2 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 4 juin 2010 - 4 juin 2010 à 14:54
Bonjour,

dans le cadre d'un projet, j'ai besoin d'intercepter et d'annuler une demande de shutdown d'un utilisateur sous seven.
L'application sur laquelle je travaille permet à un utilisatur lambda de naviguer sur internet après s'être connecté (afin que l'on puisse effectuer un suivi de sesson). Il faut par contre qu'il ne puisse rien faire d'autre que de naviguer.
Il reste malheureusement un point que je n'arrive pas à résoudre : Je n'arrive pas à supprimer le power button, j'ai désactivé toutes les autres manières de faire un shutdown.
Mais dans le cas du power button je n'arrive pas à faire mieux qu'avoir l'écran pour forcer le shutdown (ce que l'on veut empêcher dans notre cas précis).

J'ai essayé plusieurs techniques pour un résultat similaire.

en utilisant le FormClosingEventArgs :
private void Form_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
if (e.CloseReason.Equals(System.Windows.Forms.CloseReason.WindowsShutDown))
{
e.Cancel = true;
}
}

en utilisant le AbortSystemShutdown de la dll advapi32.dll:
[System.Runtime.InteropServices.DllImport("advapi32.dll", SetLastError = true)]
static extern bool AbortSystemShutdown(string lpMachineName);

private void Form_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
if (e.CloseReason.Equals(System.Windows.Forms.CloseReason.WindowsShutDown))
{
if (!AbortSystemShutdown("localhost"))
{
int err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
}
}
}

en utilisant shutdown.exe:
private void Form_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
if (e.CloseReason.Equals(System.Windows.Forms.CloseReason.WindowsShutDown))
{
System.Diagnostics.Process.Start(@"C:\windows\system32\shutdown.exe", "/a");
}
}

en faisant un override du WndProc et la dll user32.dll:

public class Unmanaged
{
public class Constants
{
public const int WM_QUERYENDSESSION = 0x11;
public const int WM_ENDSESSION = 0x16;
public const int WM_CANCELMODE = 0x1f;
}

public class User32
{
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
public static extern bool ShutdownBlockReasonCreate(System.IntPtr
hWnd, [System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string reason);

[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
public static extern bool ShutdownBlockReasonDestroy(System.IntPtr
hWnd);
}
}

protected override void WndProc(ref System.Windows.Forms.Message m)
{
switch (m.Msg)
{
case Unmanaged.Constants.WM_QUERYENDSESSION:
Unmanaged.User32.ShutdownBlockReasonCreate(Handle,
"Shutdown forbidden");
System.Windows.Forms.Message MyMsg = new System.Windows.Forms.Message();

MyMsg.Msg = Unmanaged.Constants.WM_CANCELMODE;

base.WndProc(ref MyMsg);

return;
case Unmanaged.Constants.WM_ENDSESSION:
if (System.Environment.OSVersion.Version.Major >= 6)
{
Unmanaged.User32.ShutdownBlockReasonCreate(Handle, "Shutdown forbidden");
}
break;
default:
base.WndProc(ref m);

break;
}
}

est ce que quelqu'un a une idée de comment intercepter le shutdown et de l'annuler totalement ?
ou est que quelqu'un sait comment faire disparaitre le power button du menu Démarrer de windows seven ?

merci d'avance pour vos réponses.

2 réponses

cs_louis14 Messages postés 793 Date d'inscription mardi 8 juillet 2003 Statut Membre Dernière intervention 10 février 2021 8
4 juin 2010 à 09:13
Bonjor,
je ne sais pas si cet article que j'ai lu ce matin peut te servir, mais il traite des différences pour Xp et Vista :
http://www.codeproject.com/KB/system/OSEvents.aspx



En tout cas je suis interressé par la solution.
J'avais fais un outil sous XP et Win2000 qui faisait qu'on ne pouvait pas quitter l'application maximisée et le CTRL+ALT+SUP était dérouté.



louis
0
arnahel Messages postés 2 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 4 juin 2010
4 juin 2010 à 14:54
merci pour l'article Louis, je n'ai malheursement rien pû en tirer de concret pour mon problème.

J'avais fait quelque chose de similaire sous xp pour intercepter les raccourcis Windows.

Si je trouve la solution je n'oublierai pas de poster mes trouvailles ici.
0
Rejoignez-nous