Page 1 sur 3

Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 17:25
par Thyphoon
Bonjour,

je cherche a cacher le bureau de windows durant l’exécution d'une application, voilà ce que j'ai fait
j'utilise la DroopyLib

Code : Tout sélectionner

RegCreateKeyValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\","NoDesktop","1",#REG_DWORD,".")
RunProgram("calc.exe","","",#PB_Program_Wait)
RegCreateKeyValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\","NoDesktop","0",#REG_DWORD,".")
mais ça ne fonctionne pas :o( une idée ?

Pour un festival qui commence demain, on me demande (au dernier moment) de faire tourner sur une borne une application, le problème est que cette application peut être quitté très facilement... l'idée est de cacher le bureau et de redemarrer en boucle l'application via une application PB (le clavier est caché, seul la souris est dispo) ainsi ça limitera les petits malin qui voudront quitter l'application et jouer dans le système ...

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 17:38
par dayvid
C'est pas ce qui fond dans les magasin pour les portable ?
ça y resemble et la vrais question est comment parer ça ?!

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 17:45
par Thyphoon
dayvid a écrit :C'est pas ce qui fond dans les magasin pour les portable ?
ça y resemble et la vrais question est comment parer ça ?!
loll si c'est utilisé dans les bornes interactive. Et la vrai question pour moi, est comment reproduire ça !!! :oP
Il existe des applications mais bossant pour le ministère de la culture faudra 6mois pour réussir a voir une licence ... et ça doit être mis en place au plus tard demain soir

je cherche juste a sécurisé un minimum un pc de façon qu'une seul application soit accessible et que si les personnes quitte une application cette dernière se recharge automatiquement ...

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 18:09
par graph100
tu as activé le mode administrateur sur ton appli ?
parcequ'il faut avoir le droit d'écrire dans le registre !

Sinon tu peux kill explorer.exe et il faut aussi gérer le pb de ctrl+alt+suppr

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 18:22
par Thyphoon
graph100 a écrit :tu as activé le mode administrateur sur ton appli ?
parcequ'il faut avoir le droit d'écrire dans le registre !
oui j'ai bien activé le mode administrateur :o/ le souci aussi c'est que test sur un seven alors que la borne sera sous XP !
graph100 a écrit : Sinon tu peux kill explorer.exe et il faut aussi gérer le pb de ctrl+alt+suppr
[/quote]
pas bête ça je vais regarder de côté là ...

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 18:29
par graph100
autre chose : je peux pas tester : j'ai pas les lib qu'il faut pour regcreate ...
si t'as le code je peux tester sur un xp virtuel...

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 18:42
par Thyphoon
graph100 a écrit :autre chose : je peux pas tester : j'ai pas les lib qu'il faut pour regcreate ...
si t'as le code je peux tester sur un xp virtuel...
merci

Code : Tout sélectionner

Procedure RegConvertRegKeyToTopKeyAndKeyName(Key.s)
  
  Shared topKey,KeyName.s
  
  temp.s=StringField(Key,1,"\")
  temp=UCase(temp)
  Select temp
    Case "HKEY_CLASSES_ROOT"
      topKey=#HKEY_CLASSES_ROOT
    Case "HKEY_CURRENT_USER"
      topKey=#HKEY_CURRENT_USER
    Case "HKEY_LOCAL_MACHINE"
      topKey=#HKEY_LOCAL_MACHINE
    Case "HKEY_USERS"
      topKey=#HKEY_USERS 
    Case "HKEY_CURRENT_CONFIG"
      topKey=#HKEY_CURRENT_CONFIG 
  EndSelect
  
  PositionSlash=FindString(Key,"\",1)
  KeyName.s=Right(Key,(Len(Key)-PositionSlash))
  
EndProcedure

ProcedureDLL RegSetValue(Key.s, ValueName.s, Value.s, Type, ComputerName.s) ; Sets a Value
  
  ;// Type can be #REG_SZ / #REG_DWORD / #REG_BINARY / #REG_EXPAND_SZ
  ;// For REG_BINARY type use Hexa value as String
  ;// Returns 1 if successful or 0 if it fails
  
  Shared RegWow64.l,RegEx,topKey,KeyName.s
  RegConvertRegKeyToTopKeyAndKeyName(Key)
  
  If ComputerName = "."
    If RegEx
      GetHandle = RegOpenKeyEx_(topKey,KeyName,0,#KEY_ALL_ACCESS|RegWow64,@hKey) 
    Else
      GetHandle = RegOpenKey_(topKey,KeyName,@hKey) 
    EndIf
  Else 
    lReturnCode = RegConnectRegistry_(ComputerName,topKey,@lhRemoteRegistry) 
    If RegEx
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry,KeyName,0,#KEY_ALL_ACCESS|RegWow64,@hKey) 
    Else
      GetHandle = RegOpenKey_(lhRemoteRegistry,KeyName,@hKey) 
    EndIf
  EndIf 
  
  If GetHandle = #ERROR_SUCCESS 
    lpcbData = 255 
    lpData.s = Space(255) 
    
    Select Type 
        
      Case #REG_EXPAND_SZ 
        GetHandle = RegSetValueEx_(hKey, ValueName, 0, #REG_EXPAND_SZ, @Value, Len(Value) + 1) 
        
      Case #REG_SZ 
        GetHandle = RegSetValueEx_(hKey, ValueName, 0, #REG_SZ, @Value, Len(Value) + 1) 
        
      Case #REG_DWORD 
        lValue = Val(Value) 
        GetHandle = RegSetValueEx_(hKey, ValueName, 0, #REG_DWORD, @lValue, 4) 
        
      Case #REG_BINARY
        LenBuffer=Len(Value)/2
        *RegBuffer=AllocateMemory(LenBuffer)
        For n=0 To LenBuffer-1
          OctetHexa.s=Mid(Value,(n*2)+1,2)
          Octet=Val("$"+OctetHexa)
          PokeB(*RegBuffer+n,Octet)
        Next
        GetHandle= RegSetValueEx_(hKey,ValueName,0,#REG_BINARY,*RegBuffer,LenBuffer) 
        FreeMemory(*RegBuffer)
        
    EndSelect 
    
    RegCloseKey_(hKey) 
    ergebnis = 1 
    ProcedureReturn ergebnis 
  Else 
    RegCloseKey_(hKey) 
    ergebnis = 0 
    ProcedureReturn ergebnis 
  EndIf 
EndProcedure 

;RegSetValue(Key.s, ValueName.s, Value.s, Type, ComputerName.s)
;HKEY_CURRENT_USER\Software\Microsoft\ Windows\CurrentVersion\Policies\ Explorer NoDesktop
;Ouvrez \Software\Microsoft\Windows\CurrentVersion\Policies\Explorer

ProcedureDLL RegCreateKey(Key.s, ComputerName.s) ; Creates a Key
  
  ;// It create subkey if KeyPath don't exist
  ;// Returns 1 if successful or 0 if it fails
  
  Shared RegWow64.l,RegEx,topKey,KeyName.s
  
  RegConvertRegKeyToTopKeyAndKeyName(Key)  
  lpSecurityAttributes.SECURITY_ATTRIBUTEs 
  
  If ComputerName = "."
    If RegEx
      GetHandle = RegCreateKeyEx_(topKey,KeyName,0,0,#REG_OPTION_NON_VOLATILE,#KEY_ALL_ACCESS|RegWow64,@lpSecurityAttributes,@hNewKey,@GetHandle)
    Else
      GetHandle = RegCreateKey_(topKey,KeyName,@hNewKey)
    EndIf
  Else 
    lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
    If RegEx
      GetHandle = RegCreateKeyEx_(lhRemoteRegistry,KeyName,0,0,#REG_OPTION_NON_VOLATILE,#KEY_ALL_ACCESS|RegWow64,@lpSecurityAttributes,@hNewKey,@GetHandle) 
    Else
      GetHandle = RegCreateKey_(lhRemoteRegistry,KeyName,@hNewKey) 
    EndIf
  EndIf 
  
  If GetHandle = #ERROR_SUCCESS 
    GetHandle = RegCloseKey_(hNewKey) 
    CreateKey = #True 
  Else 
    CreateKey = #False 
  EndIf 
  ProcedureReturn CreateKey 
EndProcedure 

ProcedureDLL RegCreateKeyValue(Key.s,ValueName.s,Value.s,Type,ComputerName.s) ; Creates a Key and a Value in a Single Command
  
  ;// Type can be #REG_SZ or #REG_DWORD
  ;// Returns 1 if successful or 0 if it fails
  
  RegCreateKey(Key,ComputerName) 
  ProcedureReturn RegSetValue(Key,ValueName,Value,Type,ComputerName) 
EndProcedure 

Debug RegSetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\","NoDesktop","1",#REG_DWORD,".")
RunProgram("calc.exe","","",#PB_Program_Wait)
Debug RegSetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\","NoDesktop","0",#REG_DWORD,".")

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 19:16
par graph100
alors ça ne fonctionne pas

je crois que j'ai une idée de pourquoi :
j'ai voulu il y a un moment trafiquer le desktop avec le registre, et comme toi j'avais réécris une clé réglant un truc d'explorer.

seulement, explorer ne se met pas jour tout seul. Il doit falloir lui envoyer un message de maj.

Pour moi il se mettais à jour après que je l'ai relancé.

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 19:24
par Thyphoon
graph100 a écrit :alors ça ne fonctionne pas

je crois que j'ai une idée de pourquoi :
j'ai voulu il y a un moment trafiquer le desktop avec le registre, et comme toi j'avais réécris une clé réglant un truc d'explorer.

seulement, explorer ne se met pas jour tout seul. Il doit falloir lui envoyer un message de maj.

Pour moi il se mettais à jour après que je l'ai relancé.
Oui c'est ce que je commençais a me dire .. pourtant il y a 3, 4 ans j'avais reussi ... mais j'ai pas retrouvé mes sources ...

bon sinon j'ai trouvé une astuce grace a Graph100 qui fonctionne

Code : Tout sélectionner

KillProcess(GetPidProcess("explorer.exe"))
Repeat
  RunProgram("calc.exe","","",#PB_Program_Wait)
  Until GetAsyncKeyState_(#VK_TAB)
RunProgram("explorer.exe")
juste un souci pour le redemarrage de l'explorer qui ne demarre pas comme il faudrait..il faut passer part le gestionnaire de tache

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 22:32
par Backup
ton application est fenetrée ou graphique ?

je demande ça parceque je vois pas pourquoi tu sois obligé de virer le bureau win ??

moi si j'avais a faire un truc comme ça , je ferai 2 prg !

un programme plein ecran , avec un Screen dans une fenetre sans bords . qui servirai de fond (peut meme servir a afficher un LOGO ;) )
et cacherai donc le bureau ...

et ton programme en sticky par dessus !

en limitant la souris a l'aire de ton prg , ça doit etre gérable ! :)

sans utiliser les registres ...

tu peux aussi coller une fenetre sur le fond du bureau avec ce code du Soldat :

Code : Tout sélectionner

 ; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Lier une fenêtre au bureau. Ainsi, quand on réduit les applications, cette fenêtre reste visible.

; J'ai rajouté ça.
If OpenLibrary(0,"User32.dll")
    hBureau = CallFunction(0,"GetShellWindow")
    CloseLibrary(0)
EndIf

; Création de la fenêtre liée au bureau
OpenWindow(0, 0, 0, 100, 100,"Liée au bureau", #PB_Window_BorderLess | #PB_Window_ScreenCentered, hBureau)
; Il suffit de mettre en parent la fenêtre qui représente le bureau
; La fonction GetShellWindow_() permet de récupérer le handle du bureau

; Création de la GadgetList
; CreateGadgetList(WindowID(0))

ButtonGadget(0, 0, 0, 100, 100, "Quitter")

Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
        Select EventGadget()
            Case 0 ; Appui sur le bouton quitter
                Event = #PB_Event_CloseWindow
        EndSelect
    EndIf
    
Until Event = #PB_Event_CloseWindow

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 22:42
par Thyphoon
Dobro a écrit :ton application est fenetrée ou graphique ?
L'application qui doit être utilisé est graphique (c'est un CDROM interactif avec helas un gros bouton quitté en haut a gauche), mais comme c'est pour mettre en pâture dans un lieu publique (Centre Pompidou Paris) et que c'est un peu la court des miracles. Le but est de faire en sorte qu'ils ne puissent pas quitter l'application, ni se promener sur l'ordi, ni accéder au réseau.
Bref la seul chose autorisé c'est d'utiliser l'application. Si quelqu'un la quitte, elle se recharge automatiquement

merci pour le code du soldat inconnu je vais regarder ce que ça fait exactement ...

voilà ce que j'ai fait pour l'instant.
la plus part des procédures viennent de la DroopyLib ! (Merci Droppy) et merci a Graph100 pour l'idée du Kill explorer.exe
bon si quelqu'un a une meilleur idée n’hésitez pas !

Code : Tout sélectionner

Application$ = ProgramParameter()

;{/*
; MessageRequester("Explorer.exe","Pid ="+Str(GetPidProcess("explorer.exe")))
;}
#TH32CS_SNAPPROCESS = $2 
Structure PROCESSENTRY33 
  dwSize.l 
  cntUsage.l 
  th32ProcessID.l 
  th32DefaultHeapID.l 
  th32ModuleID.l 
  cntThreads.l 
  th32ParentProcessID.l 
  pcPriClassBase.l 
  dwFlags.l 
  szExeFile.b[#MAX_PATH] 
EndStructure 
ProcedureDLL GetPidProcess(Name.s) ; Returns Pid of Process if it exists / 0 if it doesn't exist
  
  ;// Author : Fred
  Name.s=UCase(Name.s)
  Recherche=0
  If OpenLibrary(0, "Kernel32.dll") 
    
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot") 
    ProcessFirst           = GetFunction(0, "Process32First") 
    ProcessNext            = GetFunction(0, "Process32Next") 
    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found 
      
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33) 
      
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0) 
      If Snapshot 
        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process) 
        While ProcessFound 
          Nom.s=UCase(PeekS(@Process\szExeFile))
          Nom=GetFilePart(Nom)
          If Nom=Name 
            Recherche =1 
            Pid=Process\th32ProcessID
          EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process) 
        Wend 
      EndIf 
      
      CloseHandle_(Snapshot) 
    EndIf 
    
    CloseLibrary(0) 
  EndIf 
  
  ProcedureReturn Pid
EndProcedure

#PROCESS_TERMINATE = $1 
#PROCESS_CREATE_THREAD = $2 
#PROCESS_VM_OPERATION = $8 
#PROCESS_VM_READ = $10 
#PROCESS_VM_WRITE = $20 
#PROCESS_DUP_HANDLE = $40 
#PROCESS_CREATE_PROCESS = $80 
#PROCESS_SET_QUOTA = $100 
#PROCESS_SET_INFORMATION = $200 
#PROCESS_QUERY_INFORMATION = $400 
#PROCESS_ALL_ACCESS = #STANDARD_RIGHTS_REQUIRED | #SYNCHRONIZE | $FFF 

ProcedureDLL KillProcess(Pid) ; Kill a process by specifying it's Pid
  ;// Author : Hi-Toro
  ;// Returns 1 if successful / 0 if it fails ( or process name doesn't exist )
  
  phandle = OpenProcess_ (#PROCESS_TERMINATE, #False, Pid) 
  If phandle <> #Null 
    If TerminateProcess_ (phandle, 1) 
      Result = #True 
    EndIf 
    CloseHandle_ (phandle) 
  EndIf 
  ProcedureReturn Result 
EndProcedure 

ProcedureDLL SearchProcess(Name.s) ; Search if a Process is Running ( Scans processes without Window(s) as well )
  ;// Author : Fred
  ;// Function isn't case sensitive
  
  Name.s=UCase(Name.s)
  Recherche=0
  If OpenLibrary(0, "Kernel32.dll") 
    
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot") 
    ProcessFirst           = GetFunction(0, "Process32First") 
    ProcessNext            = GetFunction(0, "Process32Next") 
    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found 
      
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33) 
      
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0) 
      If Snapshot 
        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process) 
        While ProcessFound 
          Nom.s=UCase(PeekS(@Process\szExeFile))
          Nom=GetFilePart(Nom)
          If Nom=Name : Recherche =1 : EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process) 
        Wend 
      EndIf 
      
      CloseHandle_(Snapshot) 
    EndIf 
    
    CloseLibrary(0) 
  EndIf 
  
  ProcedureReturn Recherche
EndProcedure 

KillProcess(GetPidProcess("explorer.exe"))

Repeat
  RunProgram(Application$,"",GetPathPart(Application$),#PB_Program_Wait)
  Until GetAsyncKeyState_(#VK_TAB)
RunProgram("explorer.exe")

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 22:43
par Backup
L'application qui doit être utilisé est graphique (c'est un CDROM interactif avec helas un gros bouton quitté en haut a gauche),
et ton bouton tu peux pas le couvrir par une fenetre sticky et FIXE sans bordure , de la meme taille ?

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 22:49
par Thyphoon
Dobro a écrit :et ton bouton tu peux pas le couvrir par une fenetre sticky et FIXE sans bordure , de la meme taille ?
c'est pas suffisant et même génant car l'application a un menu en haut et il n'y a que sur une page d'accueil qu'il y a le bouton quitter.
On risque de bloquer certaine fonctionnalité du coup !! mais l'idée était pas mauvaise !
Merci Dobro pour ton intérêt a mon problème :o)

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 22:52
par Backup
bon courage pour la suite .. :)

Re: Cacher le bureau de widows XP / Seven

Publié : sam. 17/mars/2012 23:24
par graph100
bon, j'ai testé sur mon xp virtuel, ca fonctionne.

J'ai ajouté un thread pour virer le taskgmr.exe, t'as de la chance que ce soit xp, parce que sur 7 c'est pas possible de cette manière.

ensuite, pour ton pb de lancer de explorer bizarre, bah en fait, comme tu attends que le programme soit quitter pour passer par le until vk ...
bah il faut juste maintenir tabulation en même temps que tu quittes la fenetre ;)

Code : Tout sélectionner

Application$ = "calc.exe"

;{/*
; MessageRequester("Explorer.exe","Pid ="+Str(GetPidProcess("explorer.exe")))
;}


#TH32CS_SNAPPROCESS = $2
Structure PROCESSENTRY33
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.b[#MAX_PATH]
EndStructure

ProcedureDLL GetPidProcess(Name.s) ; Returns Pid of Process if it exists / 0 if it doesn't exist
  
  ;// Author : Fred
  Name.s=UCase(Name.s)
  Recherche=0
  If OpenLibrary(0, "Kernel32.dll")
    
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
    ProcessFirst           = GetFunction(0, "Process32First")
    ProcessNext            = GetFunction(0, "Process32Next")
    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found
      
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)
      
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0)
      If Snapshot
        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
        While ProcessFound
          Nom.s=UCase(PeekS(@Process\szExeFile))
          Nom=GetFilePart(Nom)
          If Nom=Name
            Recherche =1
            Pid=Process\th32ProcessID
          EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
        Wend
      EndIf
      
      CloseHandle_(Snapshot)
    EndIf
    
    CloseLibrary(0)
  EndIf
  
  ProcedureReturn Pid
EndProcedure

#PROCESS_TERMINATE = $1
#PROCESS_CREATE_THREAD = $2
#PROCESS_VM_OPERATION = $8
#PROCESS_VM_READ = $10
#PROCESS_VM_WRITE = $20
#PROCESS_DUP_HANDLE = $40
#PROCESS_CREATE_PROCESS = $80
#PROCESS_SET_QUOTA = $100
#PROCESS_SET_INFORMATION = $200
#PROCESS_QUERY_INFORMATION = $400
#PROCESS_ALL_ACCESS = #STANDARD_RIGHTS_REQUIRED | #SYNCHRONIZE | $FFF

ProcedureDLL KillProcess(Pid) ; Kill a process by specifying it's Pid
  ;// Author : Hi-Toro
  ;// Returns 1 if successful / 0 if it fails ( or process name doesn't exist )
  
  phandle = OpenProcess_ (#PROCESS_TERMINATE, #False, Pid)
  If phandle <> #Null
    If TerminateProcess_ (phandle, 1)
      Result = #True
    EndIf
    CloseHandle_ (phandle)
  EndIf
  ProcedureReturn Result
EndProcedure

ProcedureDLL SearchProcess(Name.s) ; Search if a Process is Running ( Scans processes without Window(s) as well )
  ;// Author : Fred
  ;// Function isn't case sensitive
  
  Name.s=UCase(Name.s)
  Recherche=0
  If OpenLibrary(0, "Kernel32.dll")
    
    CreateToolhelpSnapshot = GetFunction(0, "CreateToolhelp32Snapshot")
    ProcessFirst           = GetFunction(0, "Process32First")
    ProcessNext            = GetFunction(0, "Process32Next")
    
    If CreateToolhelpSnapshot And ProcessFirst And ProcessNext ; Ensure than all the functions are found
      
      Process.PROCESSENTRY33\dwSize = SizeOf(PROCESSENTRY33)
      
      Snapshot = CallFunctionFast(CreateToolhelpSnapshot, #TH32CS_SNAPPROCESS, 0)
      If Snapshot
        
        ProcessFound = CallFunctionFast(ProcessFirst, Snapshot, Process)
        While ProcessFound
          Nom.s=UCase(PeekS(@Process\szExeFile))
          Nom=GetFilePart(Nom)
          If Nom=Name : Recherche =1 : EndIf
          ProcessFound = CallFunctionFast(ProcessNext, Snapshot, Process)
        Wend
      EndIf
      
      CloseHandle_(Snapshot)
    EndIf
    
    CloseLibrary(0)
  EndIf
  
  ProcedureReturn Recherche
EndProcedure

Procedure DenyTaskmgr(bla.l)
  Repeat
    Delay(50)
    
;     If SearchProcess("taskmgr.exe")
      KillProcess(GetPidProcess("taskmgr.exe"))
;     EndIf
  ForEver
EndProcedure


KillProcess(GetPidProcess("explorer.exe"))

thread_id = CreateThread(@DenyTaskmgr(), 0)

Repeat
  RunProgram(Application$,"",GetPathPart(Application$),#PB_Program_Wait)
Until GetAsyncKeyState_(#VK_TAB)

Debug "bla"

KillThread(thread_id)

RunProgram("explorer.exe")
Je te conseille quand même de mettre plus qu'une touche et de pas mettre Tab : surtout que tu as posté le code sur le fofo ^^