Page 1 sur 2

CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 8:18
par PhM
Bonjour,
Je ne comprends pas l’utilisation de CloseProgram et KillProgram.
Je souhaite fermer le navigateur par défaut qui vient d'être correctement ouvert avec RunProgram (page$).
Comprenez-vous pourquoi cela ne fonctionne pas ?

Code : Tout sélectionner

page$ = "https://www.qwant.com/"
RunProgram (page$)

Delay(5000)

CloseProgram(page$)
KillProgram(page$)

Delay(5000)

End

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 9:17
par doudouvs
Bonjour,

CloseProgram() Cette commande ne force pas le programme à se terminer, seule la connexion avec lui est fermée. Pour forcer le programme à quitter, la commande KillProgram() est disponible. De plus, même si le programme se termine de façon normale, il est important d'appeler CloseProgram() pour libérer toutes les ressources.

c'est dans l'aide exemple : tu sélectionne avec la souri KillProgram puis la touche F1 et ta la doc


La du coup tu ferme ferme page$ c'est pas bon, il faut faire

Code : Tout sélectionner

out = RunProgram(page$)
CloseProgram(out)

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 9:58
par PhM
Merci pour ta réponse rapide. malheureusement, cela ne fonctionne pas et provoque une erreur :

[ERREUR] L'argument 'Program' spécifié n'est pas valide.

Code : Tout sélectionner

page$ = "https://www.qwant.com/"
out = RunProgram (page$)

Delay(5000)

CloseProgram(out)
KillProgram(out)

Delay(5000)

End

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:03
par doudouvs
Normal https://www.qwant.com n'est pas un program

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:06
par doudouvs
sous Windows c'est surement un truc comme ça
RunProgram("iexplore.exe","http://www.purebasic.fr","")

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:14
par PhM
Non, toujours une erreur "fatale" à la fermeture !

Code : Tout sélectionner


out = RunProgram ("Firefox.exe","http://www.purebasic.fr","")

Delay(5000)

CloseProgram(out)
KillProgram(out)

Delay(5000)

End


Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:17
par Marc56
Il faut ouvrir un canal de communication avec le programme lancé pour pouvoir le fermer.

Code : Tout sélectionner

ID = RunProgram("iexplore.exe", 
                "http://www.purebasic.fr", 
                "", 
                #PB_Program_Open)
Delay(3000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:28
par PhM
Oui Marc56, cela fonctionne mais uniquement avec iexplorer.exe.

Le navigateur ne se ferme pas avec firefox.exe ou chrome.exe.

Code : Tout sélectionner

;prog$ = "chrome.exe"
;prog$ = "firefox.exe"
prog$ = "iexplore.exe"
page$ = "http://www.purebasic.fr"

ID = RunProgram (prog$,page$,"",#PB_Program_Open)

Delay(5000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf


End

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:33
par Marc56
1. Firefox ou Chrome n'étant pas dans le PATH, il faut alors préciser le chemin complet
2. Il ne faut pas qu'il soit déjà ouvert

Code : Tout sélectionner

; Prog$ = "iexplore.exe", 
; Prog$ = "C:\Program Files\Mozilla Firefox\firefox.exe"
  Prog$ = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

ID = RunProgram(Prog$, 
                "http://www.purebasic.fr", 
                "", 
                #PB_Program_Open)
Delay(3000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:37
par PhM
Ok, merci Marc56, maintenant je comprends...

Et, pour info doudouvs, il n'y a aucun exemple dans "tu sélectionnes avec la souris KillProgram puis la touche F1 et tu as la doc".
En tout cas pour la version PureBasic 5.71 LTS (x64)

Merci à vous deux.
Philippe

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 10:50
par PhM
Finalement, même comme cela le code fonctionne avec les trois navigateurs :

Code : Tout sélectionner

;prog$ = "chrome.exe"
prog$ = "firefox.exe"
;prog$ = "iexplore.exe"

page$ = "http://www.purebasic.fr"

ID = RunProgram (prog$,page$,"",#PB_Program_Open)

Delay(5000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf

End
Néanmoins, maintenant j'ai une question en rapport direct :
Pour qu'un programme de ce type fonctionne, quelque soit le navigateur par défaut et sur toute machine.
Comment connaitre le navigateur par défaut d'une machine quelconque avant de lancer ID = RunProgram de l'exemple ci-dessus ?

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 11:21
par Ar-S
Salut,
Une piste.
Tu peux examiner le registre (cherche base de registre dans le forum) et regarder dans cette clé :

Code : Tout sélectionner

HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
La tu regardes la chaine : ProgId et tu vois le nom du navigateur.


Voilà un exemple, (code bdr extrait de la droopy libs je pense).
Je ne cherche que le mot firefox car c'est mon navigateur par defaut, mais je suppose que tu trouveras aussi chrome, IE... J'ai pas plus cherché que ça

Code : Tout sélectionner




#LIBRARY_VERSION="5.42.002"
  
#KEY_WOW64_64KEY=$100
#KEY_WOW64_32KEY=$200


Declare IsWow64Process()
Declare Wow64DisableWow64FsRedirection()
Declare Wow64RevertWow64FsRedirection()
Declare RegMode(Ex,Wow64)
Declare.s RegGetValue(Key.s, ValueName.s, ComputerName.s)


;&&&1 IsWow64Process
Procedure IsWow64Process() ;+++
  ;/// Determines whether the specified process is running under WOW64.
  ;/// Return TRUE if the process is running under WOW64.
  ;/// Return FALSE if the process is running under 32-bit Windows or if the process is a 64-bit application running under 64-bit Windows
  
  Lid = OpenLibrary(#PB_Any, "kernel32") 
  If Lid  
    CallFunction(Lid,"IsWow64Process",GetCurrentProcess_(),@ret) 
    CloseLibrary(Lid) 
    ProcedureReturn ret
  EndIf 
  
EndProcedure 

;&&&1 Wow64DisableWow64FsRedirection
Procedure Wow64DisableWow64FsRedirection() ;+++
  ;/// Disables file system redirection for the calling thread. File system redirection is enabled by default
  ;/// If the function succeeds, the return value is a nonzero value.
  ;/// If the function fails, the Return value is zero.
  ;/// Use RegMode() for accessing 64-bit key
  
  Shared Wow64OldValue
  
  If IsWow64Process()
    Lid=OpenLibrary(#PB_Any, "kernel32.dll")
    If Lid
      GetFunction(Lid,"Wow64DisableWow64FsRedirection")
      ret=CallFunction(Lid,"Wow64DisableWow64FsRedirection",@Wow64OldValue)
      CloseLibrary(Lid)
      ProcedureReturn ret
    Else  
      Debug "Unable to Open kernel32.dll"
      ProcedureReturn #False
    EndIf
  EndIf
  
EndProcedure

;&&&1 Wow64RevertWow64FsRedirection
Procedure Wow64RevertWow64FsRedirection() ;+++
  ;/// Restores file system redirection for the calling thread
  ;/// If the function succeeds, the return value is a nonzero value.
  ;/// If the function fails, the Return value is zero.
  
  Shared Wow64OldValue
  
  If IsWow64Process()
    Lid=OpenLibrary(#PB_Any,"kernel32.dll")
    If Lid
      ret=CallFunction(Lid,"Wow64RevertWow64FsRedirection",@Wow64OldValue)
      CloseLibrary(Lid)
      ProcedureReturn ret
    EndIf
  EndIf
  
EndProcedure


Enumeration
  #KEY_WOW64_64KEY=$100 ;//Resident
  #KEY_WOW64_32KEY=$200 ;//Resident
EndEnumeration

Procedure RegMode(Ex,Wow64) ;+++
  ;/// Set Registry access mode<br>
  ;/// <b>Ex</b> Use Extended Registry Functions
  ;/// #False (Default) use old Registry functions
  ;/// #True : Use 'New' Registry Functions (Some key cannot be viewed as simple user)<br>
  ;/// <b>Wow64</b> Access an Alternate Registry View
  ;/// By default, a 32-bit application running on WOW64 accesses the 32-bit registry view and a 64-bit application accesses the 64-bit registry view.
  ;/// The following flags enable 32-bit applications to access redirected keys in the 64-bit registry view and 64-bit applications to access redirected keys in the 32-bit registry view.
  ;/// These flags have no effect on shared registry keys.
  ;/// <b>#KEY_WOW64_64KEY</b> Access a 64-bit key from either a 32-bit or 64-bit application. (RegEx(#True) required)
  ;/// <b>#KEY_WOW64_32KEY</b> Access a 32-bit key from either a 32-bit or 64-bit application.
  ;/// <br><A href="http://msdn.microsoft.com/en-us/library/aa384253(v=VS.85).aspx">Registry Keys Affected by WOW64</A>
 
  Shared RegWow64.l,RegEx.l
  
  RegEx=Ex
  RegWow64=Wow64
  
EndProcedure

Procedure RegConvertRegKeyToTopKeyAndKeyName(Key.s) ; internl function
  
  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

;&&&1 RegGetValue
Procedure.s RegGetValue(Key.s, ValueName.s, ComputerName.s) ;+++
  ;/// Gets a Value
  ;/// This function can only read #REG_SZ #REG_DWORD #REG_BINARY #REG_EXPAND_SZ types
  ;/// The #REG_BINARY type returns the value as a hex number
  ;/// Returns the value of the Key / Empty String if Value Name doesn't exist
  
  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 = 1024 
    lpData.s = Space(lpcbData) 
    
    GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @Type, @lpData, @lpcbData) 
    
    If GetHandle = #ERROR_SUCCESS 
      
      Select Type 
        Case #REG_SZ 
          
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @Type, @lpData, @lpcbData) 
          
          If GetHandle = 0 
            GetValue.s = Left(lpData, lpcbData - 1) 
          Else 
            GetValue = "" 
          EndIf 
          
        Case #REG_EXPAND_SZ 
          
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @Type, @lpData, @lpcbData) 
          
          If GetHandle = 0 
            GetValue = Left(lpData, lpcbData - 1) 
          Else 
            GetValue = "" 
          EndIf 
          
          
          
        Case #REG_DWORD 
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @lpType, @lpDataDWORD, @lpcbData) 
          
          If GetHandle = 0 
            GetValue = Str(lpDataDWORD) 
          Else 
            GetValue = "0" 
          EndIf 
          
        Case #REG_BINARY 
          BinaryBytes=1024
          *RegBinary=AllocateMemory(BinaryBytes) 
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @lType, *RegBinary, @BinaryBytes) 
          If GetHandle = 0 ; SUCCESs
            GetValue=""
            For i = 0 To (BinaryBytes-1 )
              Temp3=PeekB(*RegBinary+i)&$000000FF
              If Temp3<16 : GetValue+"0" : EndIf
              GetValue+ Hex(Temp3)
            Next 
            FreeMemory(*RegBinary)
          EndIf 
          
      EndSelect 
    EndIf 
  EndIf 
  RegCloseKey_(hKey) 
  ProcedureReturn GetValue 
EndProcedure 





Global key$ = "HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\"
Catch.s = RegGetValue(Key$, "ProgId", ".")

If FindString(catch,"Firefox")
  Debug "Le navigateur par defaut est Firefox"
  ;ElseIf ....
  
EndIf


Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 11:59
par PhM
Salut Ar-s,

Effectivement cela fonctionne avec les trois navigateurs tester :

Code : Tout sélectionner

If FindString(catch,"Firefox")
  Debug "Le navigateur par defaut est Firefox"
ElseIf FindString(catch,"Chrome")
  Debug "Le navigateur par defaut est Chrome"
ElseIf FindString(catch,"IE")
  Debug "Le navigateur par defaut est IExplorer" 
EndIf
Mais, quelle débauche de moyens (listing de 220 lignes) pour avoir ce simple renseignement !
En tout cas, merci pour le tuyau.

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 12:06
par Marc56
Tu peux faire ça:

Code : Tout sélectionner

SetCurrentDirectory(GetTemporaryDirectory())
RunProgram("reg",  "export HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice cle.ini /y", "")
Puis analyser le fichier %temp%\cle.ini

ou directement (avec runprogram)

Code : Tout sélectionner

reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
et analyser le flux de sortie

reg /?
pour voir les autres possibilités.

:wink:

Re: CloseProgram et KillProgram ???

Publié : ven. 03/janv./2020 13:31
par Ar-S
PhM a écrit :Salut Ar-s,
Mais, quelle débauche de moyens (listing de 220 lignes) pour avoir ce simple renseignement !
En tout cas, merci pour le tuyau.
Disons que la partie des proces est un code récurrent pour toutes les fois où tu auras besoin de lire dans le registre.
La version complète permet de lire, ecrire, lister etc et est donc bien plus longue. Là je t'ai filé le nécessaire.
Perso j'ai un dossier PROCE dans mes dossiers de code et je les appelle via un .PBI quand j'en ai besoin.
ça te parait être une débauche de code mais c'est tout de même une série de commandes pour aller fouiller dans le cerveau de windows :) C'est pas rien et au final, 200 lignes c'est pas grand chose.