VB 2010 Import DLL (FindWindow, FindWindowEx & SendMessage) [Résolu]

Nicolas H. 36 Messages postés vendredi 19 octobre 2001Date d'inscription 26 mai 2016 Dernière intervention - 17 avril 2012 à 00:43 - Dernière réponse : Nicolas H. 36 Messages postés vendredi 19 octobre 2001Date d'inscription 26 mai 2016 Dernière intervention
- 19 avril 2012 à 19:01
Bonjour,

Je souhaite manipuler une application externe dans le cadre d'un projet.

J'ai importé les API, j'ai écrit mon code (voir ci-dessous), etc.

L'application est bien contrôlée mais si je veux fermer le soft après une exécution, il plante.

Si j'en exécute plusieurs d'affilé, il plante aussi.

J'ai vérifié que mes Threads étaient bien fermés et mon Sub se termine bien.

J'ai testé beaucoup de chose et la je ne vois pas trop comment résoudre le problème, auriez-vous une idée ?


Erreur :

.net 4 :
System.AccessViolationException was unhandled
Message: [Resource lookup failed - infinite recursion or critical failure detected.]

FatalExecutionEngineError was detected
Message: The runtime has encountered a fatal error. The address of the error was at 0x6e940b17, on thread 0x26a4. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.


.net 3.5 :
System.AccessViolationException was unhandled
Message=Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
Source=System
StackTrace:
à Microsoft.Win32.NativeMethods.ShellExecuteEx(ShellExecuteInfo info)
à System.Diagnostics.ShellExecuteHelper.ShellExecuteFunction()
à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
à System.Threading.ExecutionContext.runTryCode(Object userData)
à System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
à System.Threading.ThreadHelper.ThreadStart()
InnerException:


Sorry, le code n'est pas encore clean, je le test avant import dans un autre projet.



Option Strict On

Imports System.Runtime.InteropServices
Imports System.Threading

Public Class Form1

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SetWindowText(ByVal hwnd As IntPtr, ByVal lpString As String) As Boolean
    End Function

    Private Const WM_GETTEXT As Integer = &HD
    Public Const WM_SETTEXT As Integer = &HC

    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202

    Public Const BM_GETCHECK = &HF0
    Private Const BM_SETCHECK = &HF1

    Private Const BST_UNCHECKED = &H0
    Private Const BST_CHECKED = &H1

    Dim SetTextOK As Boolean = False

    Dim x As Integer

    Dim mProcess As Process

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        x += 1
        Me.Text = x.ToString
        Dim VobSub As New Thread(Sub()
                                     Process.Start("x:\VSRW.exe")
                                 End Sub)
        VobSub.IsBackground = True
        VobSub.Start()
        VobSub_AutoPilot()
    End Sub

    Private Sub VobSub_AutoPilot()
        Dim VobSubHandle As IntPtr

        Dim Found As Boolean = True
        Do
            VobSubHandle = FindWindow(vbNullString, "VobSub Ripper Wizard")
            If VobSubHandle.ToString <> "0" Then
                SetTextOK = SetWindowText(VobSubHandle, "DVD2MKV-VobSub Ripper Wizard")
                Found = False
            Else
                Thread.Sleep(50)
            End If
        Loop Until Not Found

        VobSubHandle = FindWindow(vbNullString, "DVD2MKV-VobSub Ripper Wizard")

        'Load IFO...
        Dim ChildHandle As IntPtr = FindWindowEx(VobSubHandle, CType(0, IntPtr), vbNullString, "VobSub Ripper Wizard")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 7 Step 1
            ChildHandle = FindWindowEx(VobSubHandle, ChildHandle, vbNullString, vbNullString)
        Next
        Dim Handle As IntPtr = ChildHandle
        For i As Integer = 0 To 2 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next
        Dim lThread As New Thread(Sub()
                                      SendMessage(ChildHandle, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
                                      SendMessage(ChildHandle, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))
                                  End Sub)
        lThread.IsBackground = True
        lThread.Start()

        Found = True
        Do
            Handle = FindWindow(vbNullString, "Ouvrir")
            If Handle.ToString <> "0" Then
                Found = False
            Else
                Thread.Sleep(500)
            End If
        Loop Until Not Found
        ChildHandle = FindWindowEx(Handle, CType(0, IntPtr), vbNullString, "Ouvrir")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 9 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next
        SendMessage(ChildHandle, WM_SETTEXT, CType(0, IntPtr), Marshal.StringToHGlobalUni("x:\VIDEO_TS\VTS_01_0.IFO"))
        For i As Integer = 0 To 3 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next
        SendMessage(ChildHandle, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
        SendMessage(ChildHandle, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))

        lThread.Abort()

        'Get VOB Loaded
        Dim ValidOpen As String
        ValidOpen = "Opening ifo OK" & vbCrLf
        ValidOpen &= "Parsing ifo OK" & vbCrLf
        ValidOpen &= "Searching vobs..." & vbCrLf
        Dim Fl As New IO.DirectoryInfo("x:\VIDEO_TS")
        Dim arFi As IO.FileInfo() = Fl.GetFiles("*.vob")
        Dim gFi As IO.FileInfo
        For Each gFi In arFi
            ValidOpen &= "Found " & "x:\VIDEO_TS" & gFi.Name & vbCrLf
        Next
        ValidOpen &= vbCrLf

        ChildHandle = FindWindowEx(VobSubHandle, CType(0, IntPtr), vbNullString, "VobSub Ripper Wizard")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 7 Step 1
            ChildHandle = FindWindowEx(VobSubHandle, ChildHandle, vbNullString, vbNullString)
        Next
        Handle = ChildHandle
        For i As Integer = 0 To 5 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next

        Dim Loading As IntPtr = Marshal.AllocHGlobal(Len(ValidOpen))
        Dim Loaded As String
        Dim Count As Integer

        Found = True
        Do
            Count = 0
            SendMessage(ChildHandle, WM_GETTEXT, CType(Len(ValidOpen), IntPtr), Loading)
            Loaded = Marshal.PtrToStringUni(Loading)
            For i As Integer = 0 To Loaded.Split(CChar(vbCrLf)).Count - 1
                If Loaded.Split(CChar(vbCrLf))(i).ToLower = ValidOpen.Split(CChar(vbCrLf))(i).ToLower Then Count += 1
            Next
            If Count = ValidOpen.Split(CChar(vbCrLf)).Count - 1 Then
                Found = False
            Else
                Thread.Sleep(500)
            End If
        Loop Until Not Found
        Thread.Sleep(1000)

        'Save as...
        ChildHandle = FindWindowEx(VobSubHandle, CType(0, IntPtr), vbNullString, "VobSub Ripper Wizard")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 7 Step 1
            ChildHandle = FindWindowEx(VobSubHandle, ChildHandle, vbNullString, vbNullString)
        Next
        Handle = ChildHandle
        For i As Integer = 0 To 4 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next
        Dim sThread As New Thread(Sub()
                                      SendMessage(ChildHandle, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
                                      SendMessage(ChildHandle, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))
                                  End Sub)
        sThread.IsBackground = True
        sThread.Start()

        Found = True
        Do
            Handle = FindWindow(vbNullString, "Enregistrer sous")
            If Handle.ToString <> "0" Then
                Found = False
            Else
                Thread.Sleep(500)
            End If
        Loop Until Not Found

        ChildHandle = FindWindowEx(Handle, CType(0, IntPtr), vbNullString, "Enregistrer sous")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 9 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next
        For i As Integer = 0 To 3 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next
        SendMessage(ChildHandle, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
        SendMessage(ChildHandle, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))

        'Next >
        ChildHandle = FindWindowEx(VobSubHandle, CType(0, IntPtr), vbNullString, "VobSub Ripper Wizard")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 3 Step 1
            ChildHandle = FindWindowEx(VobSubHandle, ChildHandle, vbNullString, vbNullString)
        Next
        SendMessage(ChildHandle, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
        SendMessage(ChildHandle, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))

        'Get Extract Sub.
        Dim ValidStarted As String = "Indexing..." & vbCrLf

        ChildHandle = FindWindowEx(VobSubHandle, CType(0, IntPtr), vbNullString, "VobSub Ripper Wizard")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 9 Step 1
            ChildHandle = FindWindowEx(VobSubHandle, ChildHandle, vbNullString, vbNullString)
        Next
        Handle = ChildHandle
        For i As Integer = 0 To 6 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next

        Loading = Marshal.AllocHGlobal(Len(ValidStarted))
        Loaded = ""

        Found = True
        Do
            SendMessage(ChildHandle, WM_GETTEXT, CType(Len(ValidStarted), IntPtr), Loading)
            Loaded = Marshal.PtrToStringUni(Loading)
            If Loaded.Split(CChar(vbCrLf))(0).ToLower = ValidStarted.Split(CChar(vbCrLf))(0).ToLower Then
                Found = False
            Else
                Thread.Sleep(1000)
            End If
        Loop Until Not Found

        'Close Dialog
        ChildHandle = FindWindowEx(VobSubHandle, CType(0, IntPtr), vbNullString, "VobSub Ripper Wizard")
        ChildHandle = FindWindowEx(ChildHandle, CType(0, IntPtr), vbNullString, vbNullString)
        For i As Integer = 0 To 9 Step 1
            ChildHandle = FindWindowEx(VobSubHandle, ChildHandle, vbNullString, vbNullString)
        Next
        Handle = ChildHandle
        For i As Integer = 0 To 3 Step 1
            ChildHandle = FindWindowEx(Handle, ChildHandle, vbNullString, vbNullString)
        Next

        Found = True
        Do
            If SendMessage(ChildHandle, BM_GETCHECK, CType(0, IntPtr), CType(0, IntPtr)).ToString = "1" Then
                Found = False
            Else
                SendMessage(ChildHandle, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
                SendMessage(ChildHandle, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))
                Thread.Sleep(1000)
            End If
        Loop Until Not Found

    End Sub

End Class

Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Nicolas H. 36 Messages postés vendredi 19 octobre 2001Date d'inscription 26 mai 2016 Dernière intervention - 18 avril 2012 à 00:35
3
Merci
Bonjour,

Merci, cmarcotte & Renfield.


cmarcotte : Je n'aime pas trop la doc mais j'ai quand même cherché (je préfère une démo, c'est plus clair enfin je trouve). J'ai trouvé pas mal de la littérature et je n'ai pas compris grand-chose (je ne l'ai quand anglais).

Renfield : J'ai creusé la fonction GetDlgItem et c'est beaucoup plus pratique.


En réécrivant mon code avec cette fonction, j'ai vu pas mal de chose.

Je pensais enfin avoir un peu compris les API et bien non.

En plus du GetDlgItem, le SendDlgItemMessage est aussi très utile.


    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SendDlgItemMessage(ByVal hDlg As IntPtr, ByVal nIDDlgItem As Integer, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function


En modifiant un peu cette fonction, j'ai pu me passer de tous les Marshal... (pour du GET) et utilisé un SendMessage GETTEXT.

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)> _
    Private Shared Function SendDlgItemMessageA(ByVal hDlg As IntPtr, ByVal nIDDlgItem As Integer, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As System.Text.StringBuilder) As IntPtr
    End Function



Mon Sub est maintenant pleinement opérationnel sur une vingtaine d'exécution.


Le code :

Option Strict On

Imports System.Runtime.InteropServices
Imports System.Threading
Imports System.Text

Public Class Form1

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SetWindowText(ByVal hwnd As IntPtr, ByVal lpString As String) As Boolean
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function GetDlgItem(ByVal hDlg As IntPtr, nIDDlgItem As Integer) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function SendDlgItemMessage(ByVal hDlg As IntPtr, ByVal nIDDlgItem As Integer, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)> _
    Private Shared Function SendDlgItemMessageA(ByVal hDlg As IntPtr, ByVal nIDDlgItem As Integer, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As System.Text.StringBuilder) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
    End Function

    Private Const BM_CLICK As Integer = &HF5

    Private Const WM_SETTEXT As Integer = &HC
    Private Const WM_GETTEXT As Integer = &HD

    Private Const WM_LBUTTONDOWN As Integer = &H201
    Private Const WM_LBUTTONUP As Integer = &H202

    Dim x As Integer = 0

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim lThread As New Thread(Sub()
                                      Process.Start("x:\VSRW.exe")
                                  End Sub)
        lThread.IsBackground = True
        lThread.Start()

        VobSub_AutoPilot()

        x += 1
        Me.Text = x.ToString

    End Sub

    Private Sub VobSub_AutoPilot()
        'Get Window
        Dim VobSubHandle As IntPtr

        Dim Found As Boolean = True
        Do
            VobSubHandle = FindWindow(vbNullString, "VobSub Ripper Wizard")
            If VobSubHandle.ToString <> "0" Then
                SetWindowText(VobSubHandle, "DVD2MKV-VobSub Ripper Wizard")
                Found = False
            Else
                Thread.Sleep(50)
            End If
        Loop Until Not Found

        Dim VobSubChildHandle As IntPtr = GetDlgItem(VobSubHandle, 0)

        'Load IFO...
        Dim lThread As New Thread(Sub()
                                      SendDlgItemMessage(VobSubChildHandle, 1000, BM_CLICK, CType(0, IntPtr), CType(0, IntPtr))
                                  End Sub)
        lThread.IsBackground = True
        lThread.Start()

        Dim WinOpen As IntPtr

        Found = True
        Do
            WinOpen = FindWindow(vbNullString, "Ouvrir")
            If WinOpen.ToString <> "0" Then
                Found = False
            Else
                Thread.Sleep(500)
            End If
        Loop Until Not Found

        Dim File As String = "x:\VIDEO_TS\VTS_01_0.IFO"

        SendDlgItemMessage(WinOpen, 1148, WM_SETTEXT, CType(Len(File), IntPtr), Marshal.StringToHGlobalUni(File))
        SendDlgItemMessage(WinOpen, 1, BM_CLICK, CType(0, IntPtr), CType(0, IntPtr))

        'Get End Loaded
        Dim ValidLoad As String
        ValidLoad = "Opening ifo OK" & vbCrLf
        ValidLoad &= "Parsing ifo OK" & vbCrLf
        ValidLoad &= "Searching vobs..." & vbCrLf
        Dim Fl As New IO.DirectoryInfo("x:\VIDEO_TS")
        Dim arFi As IO.FileInfo() = Fl.GetFiles("*.vob")
        Dim gFi As IO.FileInfo
        For Each gFi In arFi
            ValidLoad &= "Found " & "x:\VIDEO_TS" & gFi.Name & vbCrLf
        Next
        ValidLoad &= vbCrLf

        Dim Count As Integer
        Dim VobLoad As New StringBuilder(Len(ValidLoad))

        Found = True
        Do
            Count = 0
            SendDlgItemMessageA(VobSubChildHandle, 1017, WM_GETTEXT, New IntPtr(VobLoad.Capacity), VobLoad)
            For i As Integer = 0 To VobLoad.ToString.Split(CChar(vbCrLf)).Count - 1
                If VobLoad.ToString.Split(CChar(vbCrLf))(i).ToLower = ValidLoad.Split(CChar(vbCrLf))(i).ToLower Then Count += 1
            Next
            If Count = ValidLoad.Split(CChar(vbCrLf)).Count - 1 Then
                Found = False
            Else
                Thread.Sleep(500)
            End If
        Loop Until Not Found

        'Save as...
        Dim sThread As New Thread(Sub()
                                      SendDlgItemMessage(VobSubChildHandle, 1001, BM_CLICK, CType(0, IntPtr), CType(0, IntPtr))
                                  End Sub)
        sThread.IsBackground = True
        sThread.Start()

        Dim WinSave As IntPtr

        Found = True
        Do
            WinSave = FindWindow(vbNullString, "Enregistrer sous")
            If WinSave.ToString <> "0" Then
                Found = False
            Else
                Thread.Sleep(500)
            End If
        Loop Until Not Found

        SendDlgItemMessage(WinSave, 1, BM_CLICK, CType(0, IntPtr), CType(0, IntPtr))

        'Next
        Thread.Sleep(500)
        SendDlgItemMessage(VobSubHandle, 1001, BM_CLICK, CType(0, IntPtr), CType(0, IntPtr))

        'Get Indexing
        Dim ValidIndexing As String = "Indexing..." & vbCrLf

        Dim IndexingLoad As New StringBuilder(Len(ValidIndexing))

        VobSubChildHandle = VobSubHandle

        For i As Integer = 0 To 3 Step 1
            VobSubChildHandle = FindWindowEx(VobSubHandle, VobSubChildHandle, "#32770", vbNullString)
        Next

        Found = True
        Do
            Count = 0
            SendDlgItemMessageA(VobSubChildHandle, 1005, WM_GETTEXT, New IntPtr(IndexingLoad.Capacity), IndexingLoad)
            If IndexingLoad.ToString.Split(CChar(vbCrLf))(0).ToLower = ValidIndexing.Split(CChar(vbCrLf))(0).ToLower Then
                Found = False
            Else
                Thread.Sleep(1000)
            End If
        Loop Until Not Found

        'Close Dialog
        SendDlgItemMessage(VobSubChildHandle, 1004, WM_LBUTTONDOWN, CType(0, IntPtr), CType(0, IntPtr))
        SendDlgItemMessage(VobSubChildHandle, 1004, WM_LBUTTONUP, CType(0, IntPtr), CType(0, IntPtr))

    End Sub

End Class

Merci Nicolas H. 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de Nicolas H.
Utilisateur anonyme - 17 avril 2012 à 05:10
0
Merci
Bonjour,

Si tu programmes une solution pour une machine 64 bits, il faut procéder à des actions supplémentaires au niveau de l'appel des fonctions de l'API 32 bits. Ils en parlent justement dans l'aide de VB2010.
Commenter la réponse de Utilisateur anonyme
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 17 avril 2012 à 11:06
0
Merci
voir
GetDlgItem

devrai t'aider a simplifier tout ce code

Renfield - Admin CodeS-SourceS - MVP Visual Basic & Spécialiste des RegExp
Commenter la réponse de Renfield
Utilisateur anonyme - 18 avril 2012 à 02:47
0
Merci
Bonjour,

À moins que tu doives affronter un Service de Dictature Informatique imbécile, il est facile d'avoir une grande partie de l'aide de VB2010 en Français

1) Ouvrir la bibliothèque d'aide

2) Cliquer sur Gérer les paramètres de l'aide

3) Cliquer sur Installer du contenu à partir d'une source en ligne

4) Un peu de patience

5) Choisir les documents nécessaires

6) Cliquer sur mettre à jour

Après cela devrait aller tout seul..
Commenter la réponse de Utilisateur anonyme
Nicolas H. 36 Messages postés vendredi 19 octobre 2001Date d'inscription 26 mai 2016 Dernière intervention - 19 avril 2012 à 19:01
0
Merci
Bonjour,

Merci pour l'info mais je n'ai pas d'option pour changer la langue.

Je vais voir pour avoir le media en FR et installer la doc.
Commenter la réponse de Nicolas H.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.