Simuler un Ctrl Alt Sup

Résolu
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016 - 5 déc. 2006 à 19:14
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016 - 10 déc. 2006 à 18:24
Bonjours
Je cherche donc à simuler via l'api Keybd_event la séquence
de touches Ctrl alt et Del

j'ais testé ceci sans succès :



      keybd_event(VK_LCONTROL ,0,0,0 );
      keybd_event(VK_LMENU  ,0,0,0 );
      keybd_event(VK_DELETE ,0,0,0 );
      keybd_event(VK_DELETE ,0,2,0 );
      keybd_event(VK_LMENU  ,0,2,0 );
      keybd_event(VK_LCONTROL ,0,2,0 );

6 réponses

florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
8 déc. 2006 à 14:24
Salut,
Logiquement c'est un peu plus complexe qu'un simple Keyboard event mais j'ai trouvé un lien qui porrait t'intresser : http://www.codeproject.com/system/alt_control_delete.asp

Bon c'est pas du Delphi mais c'est largement traduisible puisque les fonctions API ont le même nom partout.
Par contre, chez moi ça ne marche pas, mais bon, ça te donnera peut être des idées.

++
Flo
3
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
8 déc. 2006 à 17:02
Merci florenth

ça marche
je précise que je l'utilise dans un service qui démarre en
tant que system donc ne marche pas forcement dans un prog classique



convertie en Delphi çà donne çà


procedure sendCtrlAltSup ;

var

  hda : THandle;

  hdk : THandle;

begin

  hda := OpenWindowStation('winsta0', FALSE,

                             
WINSTA_ACCESSCLIPBOARD   or

                             
WINSTA_ACCESSGLOBALATOMS or

                             
WINSTA_CREATEDESKTOP     or

                             
WINSTA_ENUMDESKTOPS      or

                             
WINSTA_ENUMERATE         or

                             
WINSTA_EXITWINDOWS       or

                             
WINSTA_READATTRIBUTES    or

                             
WINSTA_READSCREEN        or

                             
WINSTA_WRITEATTRIBUTES);

    if hda = 0 then exit;

    //

    // Set the windowstation to be winsta0

    //

    if  not SetProcessWindowStation(hda)then exit;

    //

    // Get the default desktop on winsta0

    //

    hdk := OpenDesktop('Winlogon', 0, FALSE,

                       
DESKTOP_CREATEMENU or

                       
DESKTOP_CREATEWINDOW or

                       
DESKTOP_ENUMERATE    or

                       
DESKTOP_HOOKCONTROL  or

                       
DESKTOP_JOURNALPLAYBACK or

                       
DESKTOP_JOURNALRECORD or

                       
DESKTOP_READOBJECTS or

                       
DESKTOP_SWITCHDESKTOP or

                       
DESKTOP_WRITEOBJECTS);

    if (hdk =0)then exit;

    //

    // Set the desktop to be "default"

    //

    if not SetThreadDesktop(hdk) then exit;

    PostMessage(HWND_BROADCAST,WM_HOTKEY,0,MAKELPARAM(MOD_ALT or MOD_CONTROL,VK_DELETE));

end;
3
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 2
8 déc. 2006 à 17:37
Content que ça te plaise.
Par contre, n'oublie pas de bien libérer les variables hda et hdk.

En effet, c'est une petite lacune du code que je t'ai donné, car il ne le fait pas.

En corrigé, indenté, sécurisé et avec des commentaires, cela donne ceci :
procedure SendCtrlAltDel;
var
  hStation, hDesktop: THandle;
begin
  {>> Ouvre la station WinSta0 }
  hStation : = OpenWindowStation('Winsta0', False, WINSTA_ACCESSCLIPBOARD
  or WINSTA_ACCESSGLOBALATOMS or WINSTA_CREATEDESKTOP or WINSTA_ENUMDESKTOPS
  or WINSTA_ENUMERATE  or WINSTA_EXITWINDOWS or WINSTA_READATTRIBUTES
  or WINSTA_READSCREEN or WINSTA_WRITEATTRIBUTES);

  {>> Test de réussite }
  if hStation <> 0then
  try
    {>> Définit la station comme station par défaut de ce thread }
    if not SetProcessWindowStation(hStation) then
      Exit;

    {>> Ouverture du bureau par défaut }
    hDesktop := OpenDesktop('Winlogon', 0, False, DESKTOP_CREATEMENU
    or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL
    or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS
    or DESKTOP_SWITCHDESKTOP or DESKTOP_WRITEOBJECTS);

    {>> Test de réussite }
    if hDesktop <> 0then
    try
      {>> Définit le bureau comme bureau par défaut de ce thread }
      if not SetThreadDesktop(hDesktop) then
        Exit;

      {>> Envoi du message de hotkey à toutes le fenêtres du bureau }
      PostMessage(HWND_BROADCAST, WM_HOTKEY, 0,
       MakeLParam(MOD_ALT or MOD_CONTROL, VK_DELETE));
    finally
      {>> Libération du bureau }
      CloseDesktop(hDesktop);
    end;
  finally
    {>> Libération de la station }
    CloseWindowStation(hStation);
  end;
end;
<hr size ="2" width="100%" />
NB: Il faut avoir les droits adéquats pour pouvoir ouvrir le bureau, c'est pour cela que ça ne marche pas chez moi.

A+
Flo
3
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
7 déc. 2006 à 15:47
Salut,


Je vais regarder un peu ce que Windows propose en matière d'envoie de
message de touche... Hésites pas à me spamer en postant si j'ai pas
répondu d'ici qautre cinq jours.


De base, pour simuler un control alt suppr sous XP, suffit de lancer
manuellement l'exe qui est lancé par Windows lorsque l'on appuie sur la
combinaison de touche.


Il s'appelle taskmgr.exe, et se trouve dans C:\WINDOWS\system32 (Ou équivalent).


Un petit shellexecute, et le tour est joué (Unité ShellAPI).


@+
0

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

Posez votre question
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
7 déc. 2006 à 19:24
je necharche pas forcement à lancer le Gestionaire de tache
çà peut etre pour changer le mot de passe
ou ouvrir une session lors d'une prise de main à distance
0
fbalien Messages postés 251 Date d'inscription dimanche 7 décembre 2003 Statut Membre Dernière intervention 11 novembre 2016
10 déc. 2006 à 18:24
on peut meme faire un sauvegarde du bureau initial avnat de basculer sur 'winlogon'
  hOrgDesktop :=GetThreadDesktop(GetCurrentThreadId());
pour apres rebasculer sur le bureau initial une fois l'envoie du Ctr alt Sup fait
  SetThreadDesktop(hOrgDesktop );
sans oublier de libérer le bureau
  CloseDesktop(hOrgDesktop );
0
Rejoignez-nous