arnahel
Messages postés2Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention 4 juin 2010
-
3 juin 2010 à 10:37
arnahel
Messages postés2Date d'inscriptionlundi 23 avril 2007StatutMembreDerniè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);
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 ?
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é.