IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Intégrer le navigateur Chromium (Chrome) dans une fenêtre Windev avec CefSharp


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Par défaut Intégrer le navigateur Chromium (Chrome) dans une fenêtre Windev avec CefSharp
    Bonjour,

    Voici un petit tutorial expliquant comment intégrer le navigateur Chromium (Chrome) directement dans les fenêtres Windev, en lieu et place d'Internet Explorer et de l'activeX Shell.Explorer.
    Cela est rendu possible par l'utilisation de la librairie CefSharp (pour Chromium Embedded Framework) (https://github.com/cefsharp/CefSharp) et d'un champ Windev de type .NET 2.0 (WinForm).
    Les possibilités sont nombreuses et je ne présente donc ici que les fonctionnalités de base.

    1/Fichiers nécessaires

    Les sources pour Chromium en version 45 sont disponibles ici : https://mon-partage.fr/f/W22nIf8c/.
    Il faut copier tous les éléments dans le répertoire de votre exécutable, et dans le répertoire "Exe" de votre projet Windev pour le mode test.

    La dll WindevNet a été compilée par moi même pour permettre la récupération du résultat d'appels Javascript.

    Les autres dlls sont issues d'un projet Visual Studio (Community) de test de CefSharp, compilé avec la dernière version des packages disponibles.
    Des explications simples pour tester CefSharp avec Visual Studio sont disponibles ici : http://www.codeproject.com/Articles/...using-CefSharp.

    2/Intégration dans Windev

    Dans Windev, cliquez sur le menu Atelier/.NET/Utiliser un assemblage .NET dans votre projet.
    Dans la fenêtre listant les assemblages disponibles, cliquez sur le bouton "Parcourir" et sélectionnez les dlls "CefSharp.Core.dll", "CefSharp.WinForms.dll", "WDNetHelpers.dll" et "WindevNet.dll", présentes dans le répertoire "Exe" de votre projet.

    Dans la liste des assemblages, sélectionnez aussi l'assemblage "System.Windows.Forms".

    Cliquez sur le bouton de validation pour importer les dlls dans votre projet.

    2.1/Ajout du champ .NET 2.0 pour affichage du navigateur

    Insérez sur votre fenêtre Windev un champ .NET 2.0 (WinForm)
    Dans la description du champ, onglet "Général", sélectionnez la classe "System.Windows.Forms.Panel".

    2.2/Code d'initialisation de la fenêtre

    Dans le traitement d'initialisation de la fenêtre qui contient le champ .NET 2.0, ajoutez le code suivant, qui va permettre d'initialiser Cef et d'intercepter les événements du navigateur dans des procédures Windev.
    La liste des événements gérés n'est pas exhaustive, mais j'ai souhaité dans un premier temps mettre en place l'interception de ceux qui me paraissaient les plus importants.

    L'objet oWDJavascript va permettre d'intercepter l'événement de fin d'exécution asynchrone d'un code Javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SI PAS Cef.IsInitialized ALORS
    	Cef.Initialize()
    FIN
    
    goBrowser est un ChromiumWebBrowser("http://google.com")
    
    goBrowser.add_AddressChanged(DotNetDélégué(AdressChanged,"EventHandler<CefSharp.AddressChangedEventArgs>"))
    goBrowser.add_ConsoleMessage(DotNetDélégué(ConsoleMessage,"EventHandler<CefSharp.ConsoleMessageEventArgs>"))
    goBrowser.add_IsBrowserInitializedChanged(DotNetDélégué(IsBrowserInitializedChanged,"EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>"))
    goBrowser.add_FrameLoadStart(DotNetDélégué(FrameLoadStart,"EventHandler<CefSharp.FrameLoadStartEventArgs>"))
    goBrowser.add_FrameLoadEnd(DotNetDélégué(FrameLoadEnd,"EventHandler<CefSharp.FrameLoadEndEventArgs>"))
    goBrowser.add_LoadError(DotNetDélégué(LoadError,"EventHandler<CefSharp.LoadErrorEventArgs>"))
    goBrowser.add_LoadingStateChanged(DotNetDélégué(LoadingStateChanged,"EventHandler<CefSharp.LoadingStateChangedEventArgs>"))
    goBrowser.add_StatusMessage(DotNetDélégué(StatusMessage,"EventHandler<CefSharp.StatusMessageEventArgs>"))
    goBrowser.add_TitleChanged(DotNetDélégué(TitleChanged,"EventHandler<CefSharp.TitleChangedEventArgs>"))
    
    oWDJavascript est un WindevNet.WDJavascript
    oWDJavascript:add_EvaluateJsDone(DotNetDélégué(EvaluateJsDone,"EventHandler<EvaluateJsDoneEventArgs>"))
    
    CAS EXCEPTION:
    	Erreur(ExceptionInfo(errComplet))
    2.3/Procédures de gestion des événements

    Dans la fenêtre Windev, il faut maintenant créer les procédures correspondantes à celles déclarées dans la fonction DotNetDélégué() de l'étape 2.2 soit :

    AdressChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE AdressChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.AddressChangedEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    ConsoleMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PROCEDURE ConsoleMessage(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.ConsoleMessageEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    Trace(_oArgs.Line+" : "+_oArgs.Message)
    IsBrowserInitializedChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE IsBrowserInitializedChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.IsBrowserInitializedChangedEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    FrameLoadStart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE FrameLoadStart(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.FrameLoadStartEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    FrameLoadEnd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PROCEDURE FrameLoadEnd(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.FrameLoadEndEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
     
    bMainFrame est un booléen
    bMainFrame = _oArgs.Frame.IsMain
    SI bMainFrame ALORS
    	Trace("#############################")
    FIN
    Trace("Main Frame ? : "+bMainFrame)
    Trace("Frame Url ? : "+_oArgs.Url)
    LoadError
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE LoadError(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.LoadErrorEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    LoadingStateChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    PROCEDURE LoadingStateChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.LoadingStateChangedEventArgs <utile>)
     
    //https://github.com/cefsharp/CefSharp/blob/master/CefSharp/LoadingStateChangedEventArgs.cs
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
     
    bIsLoading est un booléen
    bIsLoading = _oArgs.get_IsLoading()
    Trace("Loading : "+bIsLoading)
    StatusMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE StatusMessage(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.StatusMessageEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    TitleChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE TitleChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.TitleChangedEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    EvaluateJsDone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PROCEDURE EvaluateJsDone(_oWDJavascript est un WindevNet.WDJavascript <utile>,_oArgs est WindevNet.EvaluateJsDoneEventArgs)    
     
    Info(_oArgs.sResult)
    2.4/Fin d'initialisation de la fenêtre

    Dans le traitement de fin d'initialisation, copier le code suivant (WinForm1 est le nom du champ .NET 2.0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    goBrowser.Dock = DockStyle.Fill
    //WinForm1 est le nom du champ .NET 2.0
    WDHelpers.AddControlToControlCollection(goBrowser,WinForm1.Controls)
    MaFenêtre..Titre += " : "+Cef.ChromiumVersion +"-"+ Cef.CefVersion+"-"+Cef.CefSharpVersion
    2.5/Fermeture de la fenêtre

    Cef.Shutdown()

    3/Fonctions diverses

    Charger une URL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    goBrowser.Load("http://google.com")
    Il est aussi possible d'accéder au DOM des documents et de le modifier à l'aide d'appels Javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sJavascript est une chaîne = [
    	document.forms["%1"].submit();
    ]
    sFormNom est une chaîne
    sFormNom = "myform"
    sJavascript = ChaîneConstruit(sJavascript,sFormNom)
    
    WebBrowserExtensions.ExecuteScriptAsync(goBrowser,sJavascript)
    Récupérer le résultat d'une fonction Javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    sJavascript est une chaîne
    sVal est une chaîne
     
    //Récupérer le contenu de la balise 'html' du document
    sJavascript = [
    document.getElementsByTagName('html')[0].innerHTML;
    ]
    EvaluateJsAsync(goBrowser,sJavascript)
    //La procédure Windev de gestion d'événement "EvaluateJsDone" est déclenchée lorsque le résultat est prêt.
     
    //Récupérer le contenu de tous les formulaires du document
    sJavascript = [
    (function() { 
    var elements = document.getElementsByTagName('form'); 
    var elementsList = ''; 
    for (var i = 0; i < elements.length; i++) { 
    	var element = elements[i]; 
    	elementsList += element.innerHTML; 
    	if (i < elements.length-1) 
    	{ 
    		elementsList += '<RC>'; 
    	} 
    } 
    return elementsList; })();
    ]
    EvaluateJsAsync(goBrowser,sJavascript)
    //La procédure Windev de gestion d'événement "EvaluateJsDone" est déclenchée lorsque le résultat est prêt.
    La procédure Windev "EvaluateJsAsync" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PROCEDURE EvaluateJsAsync(_oBrowser est un ChromiumWebBrowser, LOCAL _sJavascript est une chaîne)
     
    oFrame est CefFrameWrapper dynamique <- WebBrowserExtensions.GetMainFrame(_oBrowser)
    oWDJavascript:EvaluateJsAsync(oFrame,_sJavascript,0)
    La procédure Windev "EvaluateJsDone" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PROCEDURE EvaluateJsDone(_oWDJavascript est un WindevNet.WDJavascript <utile>,_oArgs est WindevNet.EvaluateJsDoneEventArgs)                         
     
    Info(_oArgs.sResult)
    Code C# de la dll WindevNet :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    using CefSharp;
    using System;
    using System.Threading.Tasks;
     
    namespace WindevNet
    {
        public class EvaluateJsDoneEventArgs : EventArgs
        {
            public int iID { get; set; }
            public string sResult { get; set; }
            public Task<JavascriptResponse> JavascriptResponse;
        }
     
        public class WDJavascript
        {
     
            public event EventHandler<EvaluateJsDoneEventArgs> EvaluateJsDone;
     
            protected virtual void OnEvaluateJsDone(EvaluateJsDoneEventArgs e)
            {
                EventHandler<EvaluateJsDoneEventArgs> handler = EvaluateJsDone;
                if (handler != null)
                {
                    handler(this, e);
                }
            }
     
            public void EvaluateJsAsync(IFrame f, string sJavascript,int iID=0)
            {
                f.EvaluateScriptAsync(sJavascript).ContinueWith(t =>
                {
                    var Response = t.Result;
                    EvaluateJsDoneEventArgs args = new EvaluateJsDoneEventArgs();
                    args.iID = iID;
                    args.sResult = (string)Response.Result.ToString();
                    args.JavascriptResponse = t;
                    OnEvaluateJsDone(args);
                });
            }
     
        }
     
    }

    Code C# de test de CefSharp :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    using System;
    using System.Windows.Forms;
    using CefSharp;
    using CefSharp.WinForms;
     
    namespace CefTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                InitBrowser();
            }
     
            public ChromiumWebBrowser browser;
     
            public void InitBrowser()
            {
                Cef.Initialize(new CefSettings());
                browser = new ChromiumWebBrowser("www.google.com");
     
                browser.IsBrowserInitializedChanged -= new EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>(IsBrowserInitialized);
                browser.IsBrowserInitializedChanged += new EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>(IsBrowserInitialized);
     
                browser.FrameLoadEnd -= new EventHandler<CefSharp.FrameLoadEndEventArgs>(FrameLoadEnd);
                browser.FrameLoadEnd += new EventHandler<CefSharp.FrameLoadEndEventArgs>(FrameLoadEnd);
     
                browser.ConsoleMessage -= new EventHandler<CefSharp.ConsoleMessageEventArgs>(ConsoleMessage);
                browser.ConsoleMessage += new EventHandler<CefSharp.ConsoleMessageEventArgs>(ConsoleMessage);
     
                this.Controls.Add(browser);
                browser.Dock = DockStyle.Fill;
            }
     
            private void IsBrowserInitialized(object sender, IsBrowserInitializedChangedEventArgs e)
            {
                if (e.IsBrowserInitialized)
                {
                    //Do something here
                }
            }
     
            public string EvaluateJsResponse;
     
            public void EvaluateJs(IFrame f, string Js)
            {
                f.EvaluateScriptAsync(Js).ContinueWith(x =>
                {
                    var response = x.Result;
                    if (response.Success && response.Result != null)
                    {
                        EvaluateJsResponse = (string)response.Result.ToString();
                        //Do something here (To interact with the UI you must call BeginInvoke)
                    }
                });
            }
     
            public void FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
            {
                if (e.Frame.IsMain)
                {
                    //string sJs = "document.getElementsByTagName('html')[0].innerHTML;";
                    string sJs = "(function() { var body = document.body, html = document.documentElement; return  Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); })();";
                    EvaluateJs(e.Frame, sJs);
                }
            }
     
            public void ConsoleMessage(object sender, ConsoleMessageEventArgs e)
            {
                Console.WriteLine(e.Message);
            }
     
        }
    }

    En cas de problèmes d'intégration dans Windev, la solution peut être souvent de supprimer le répertoire .NET de votre projet, de vider son répertoire de compilation <NomProjet>.cpl et de recompiler le projet.

    Merci aux intervenants de ce fil : http://www.developpez.net/forums/d14...cation-windev/ et à ochoteau en particulier pour les sources.

    Bonne prog

  2. #2
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Par défaut System.IO.FileNotFoundException: Impossible de charger le fichier ou l'assembly 'CefSharp.Core.dll'
    Attention, en cas d'erreur de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    Que s'est-il passé ?
    Le framework .NET a renvoyé l'erreur suivante : 
    Une exception a été levée par la cible d'un appel.
     
    Code erreur : 200007
    Niveau : erreur fatale (EL_FATAL)
     
    Dump de l'erreur du module 'wd190net4.dll' (19.0.3.0).
    Identifiant des informations détaillées (.err) : 200007
    Informations de débogage :
    System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.IO.FileNotFoundException: Impossible de charger le fichier ou l'assembly 'CefSharp.Core.dll' ou une de ses dépendances. Le module spécifié est introuvable.
       à CefSharp.WinForms.ChromiumWebBrowser..ctor(String address)
       --- Fin de la trace de la pile d'exception interne ---
       à System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
       à System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       à CDotNetType.vpgcrInvokeConstructor(CDotNetType* , ConstructorInfo pclConstructorInfo, CSLevel* pclPile, Int32 nNbParamPile, STOperationDotNet* pstOperation)
       à CDotNetType.vpgcrInvokeConstructor(CDotNetType* , STMethodeDotNet* pstMethode, UInt32* pdwIdentifiant, CSLevel* pclPile, Int32 nNbParamPile, STOperationDotNet* pstOperation)
       à CDotNetInstance.bExecuteConstructeur(CDotNetInstance* , STMethodeDotNet* pstMethode, UInt32* pdwIdentifiant, CSLevel* pclPile, Int32 nNbParamPile, STOperationDotNet* pstOperation)
    Informations supplémentaires :
    EIT_DATEHEURE : 22/01/2016 09:22:37
    Pensez à installer les packages redistribuables Visual C++ pour Visual Studio 2013 sur le poste concerné :

    https://www.microsoft.com/fr-fr/down....aspx?id=40784

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Par défaut Sources pour Chromium 47
    Voici les sources pour Chromium 47 :

    https://mon-partage.fr/f/CxgGgkXQ/

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 19
    Par défaut MAJ des dépendances CefSharp & CEF
    Merci bastiencb, pour ce post explicatif et clair

    Pour la montée en version de Chromium, vous pouvez récupérer les dernières mises à jour ici :

    https://www.nuget.org/packages/CefSharp.Common/
    https://www.nuget.org/packages/CefSharp.WinForms/

    https://www.nuget.org/packages/cef.redist.x86/ ou https://www.nuget.org/packages/cef.redist.x64/
    /!\ prendre la bonne version vis à vis de ce qui est indiqué dans CefSharp.Common > Dependencies.

    NB : sur "Download" vous récupérez des fichiers ".nupkg", ce sont en fait des archives ZIP.
    Je vous laisse chercher dans les archives pour les DLLs

    Bons développements !

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Par défaut
    Un très grand merci Bastien pour ton post !

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Sauriez-vous si on peut utiliser CefSharp avec SharpDevelop ?

    Merci.

  7. #7
    Invité de passage
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mars 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 1
    Par défaut Petite question fonctions retour winform
    Bonjour et merci pour votre tuto il es bien expliqué et il marche très bien, merci encore.
    j'ai juste une question comment ajouter la fonction Back et Forward dans le projet CefSharp et la dll windev, on trouve bien les fonctions load, refresh, etc.. mais pas Back et Foward.

    Cordialement

    Amine Ben.

    Citation Envoyé par bastiencb Voir le message
    Bonjour,

    Voici un petit tutorial expliquant comment intégrer le navigateur Chromium (Chrome) directement dans les fenêtres Windev, en lieu et place d'Internet Explorer et de l'activeX Shell.Explorer.
    Cela est rendu possible par l'utilisation de la librairie CefSharp (pour Chromium Embedded Framework) (https://github.com/cefsharp/CefSharp) et d'un champ Windev de type .NET 2.0 (WinForm).
    Les possibilités sont nombreuses et je ne présente donc ici que les fonctionnalités de base.

    1/Fichiers nécessaires

    Les sources pour Chromium en version 45 sont disponibles ici : https://mon-partage.fr/f/W22nIf8c/.
    Il faut copier tous les éléments dans le répertoire de votre exécutable, et dans le répertoire "Exe" de votre projet Windev pour le mode test.

    La dll WindevNet a été compilée par moi même pour permettre la récupération du résultat d'appels Javascript.

    Les autres dlls sont issues d'un projet Visual Studio (Community) de test de CefSharp, compilé avec la dernière version des packages disponibles.
    Des explications simples pour tester CefSharp avec Visual Studio sont disponibles ici : http://www.codeproject.com/Articles/...using-CefSharp.

    2/Intégration dans Windev

    Dans Windev, cliquez sur le menu Atelier/.NET/Utiliser un assemblage .NET dans votre projet.
    Dans la fenêtre listant les assemblages disponibles, cliquez sur le bouton "Parcourir" et sélectionnez les dlls "CefSharp.Core.dll", "CefSharp.WinForms.dll", "WDNetHelpers.dll" et "WindevNet.dll", présentes dans le répertoire "Exe" de votre projet.

    Dans la liste des assemblages, sélectionnez aussi l'assemblage "System.Windows.Forms".

    Cliquez sur le bouton de validation pour importer les dlls dans votre projet.

    2.1/Ajout du champ .NET 2.0 pour affichage du navigateur

    Insérez sur votre fenêtre Windev un champ .NET 2.0 (WinForm)
    Dans la description du champ, onglet "Général", sélectionnez la classe "System.Windows.Forms.Panel".

    2.2/Code d'initialisation de la fenêtre

    Dans le traitement d'initialisation de la fenêtre qui contient le champ .NET 2.0, ajoutez le code suivant, qui va permettre d'initialiser Cef et d'intercepter les événements du navigateur dans des procédures Windev.
    La liste des événements gérés n'est pas exhaustive, mais j'ai souhaité dans un premier temps mettre en place l'interception de ceux qui me paraissaient les plus importants.

    L'objet oWDJavascript va permettre d'intercepter l'événement de fin d'exécution asynchrone d'un code Javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SI PAS Cef.IsInitialized ALORS
    	Cef.Initialize()
    FIN
    
    goBrowser est un ChromiumWebBrowser("http://google.com")
    
    goBrowser.add_AddressChanged(DotNetDélégué(AdressChanged,"EventHandler<CefSharp.AddressChangedEventArgs>"))
    goBrowser.add_ConsoleMessage(DotNetDélégué(ConsoleMessage,"EventHandler<CefSharp.ConsoleMessageEventArgs>"))
    goBrowser.add_IsBrowserInitializedChanged(DotNetDélégué(IsBrowserInitializedChanged,"EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>"))
    goBrowser.add_FrameLoadStart(DotNetDélégué(FrameLoadStart,"EventHandler<CefSharp.FrameLoadStartEventArgs>"))
    goBrowser.add_FrameLoadEnd(DotNetDélégué(FrameLoadEnd,"EventHandler<CefSharp.FrameLoadEndEventArgs>"))
    goBrowser.add_LoadError(DotNetDélégué(LoadError,"EventHandler<CefSharp.LoadErrorEventArgs>"))
    goBrowser.add_LoadingStateChanged(DotNetDélégué(LoadingStateChanged,"EventHandler<CefSharp.LoadingStateChangedEventArgs>"))
    goBrowser.add_StatusMessage(DotNetDélégué(StatusMessage,"EventHandler<CefSharp.StatusMessageEventArgs>"))
    goBrowser.add_TitleChanged(DotNetDélégué(TitleChanged,"EventHandler<CefSharp.TitleChangedEventArgs>"))
    
    oWDJavascript est un WindevNet.WDJavascript
    oWDJavascript:add_EvaluateJsDone(DotNetDélégué(EvaluateJsDone,"EventHandler<EvaluateJsDoneEventArgs>"))
    
    CAS EXCEPTION:
    	Erreur(ExceptionInfo(errComplet))
    2.3/Procédures de gestion des événements

    Dans la fenêtre Windev, il faut maintenant créer les procédures correspondantes à celles déclarées dans la fonction DotNetDélégué() de l'étape 2.2 soit :

    AdressChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE AdressChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.AddressChangedEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    ConsoleMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PROCEDURE ConsoleMessage(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.ConsoleMessageEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    Trace(_oArgs.Line+" : "+_oArgs.Message)
    IsBrowserInitializedChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE IsBrowserInitializedChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.IsBrowserInitializedChangedEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    FrameLoadStart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE FrameLoadStart(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.FrameLoadStartEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    FrameLoadEnd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    PROCEDURE FrameLoadEnd(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.FrameLoadEndEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
     
    bMainFrame est un booléen
    bMainFrame = _oArgs.Frame.IsMain
    SI bMainFrame ALORS
    	Trace("#############################")
    FIN
    Trace("Main Frame ? : "+bMainFrame)
    Trace("Frame Url ? : "+_oArgs.Url)
    LoadError
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE LoadError(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.LoadErrorEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    LoadingStateChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    PROCEDURE LoadingStateChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.LoadingStateChangedEventArgs <utile>)
     
    //https://github.com/cefsharp/CefSharp/blob/master/CefSharp/LoadingStateChangedEventArgs.cs
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
     
    bIsLoading est un booléen
    bIsLoading = _oArgs.get_IsLoading()
    Trace("Loading : "+bIsLoading)
    StatusMessage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE StatusMessage(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.StatusMessageEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    TitleChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PROCEDURE TitleChanged(_oBrowser est un ChromiumWebBrowser,_oArgs est CefSharp.TitleChangedEventArgs <utile>)
     
    Trace("------------------------------")
    Trace(dbgInfo(dbgTraitement))
    Trace(_oBrowser:get_Address())
    EvaluateJsDone
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PROCEDURE EvaluateJsDone(_oWDJavascript est un WindevNet.WDJavascript <utile>,_oArgs est WindevNet.EvaluateJsDoneEventArgs)    
     
    Info(_oArgs.sResult)
    2.4/Fin d'initialisation de la fenêtre

    Dans le traitement de fin d'initialisation, copier le code suivant (WinForm1 est le nom du champ .NET 2.0) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    goBrowser.Dock = DockStyle.Fill
    //WinForm1 est le nom du champ .NET 2.0
    WDHelpers.AddControlToControlCollection(goBrowser,WinForm1.Controls)
    MaFenêtre..Titre += " : "+Cef.ChromiumVersion +"-"+ Cef.CefVersion+"-"+Cef.CefSharpVersion
    2.5/Fermeture de la fenêtre

    Cef.Shutdown()

    3/Fonctions diverses

    Charger une URL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    goBrowser.Load("http://google.com")
    Il est aussi possible d'accéder au DOM des documents et de le modifier à l'aide d'appels Javascript.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sJavascript est une chaîne = [
    	document.forms["%1"].submit();
    ]
    sFormNom est une chaîne
    sFormNom = "myform"
    sJavascript = ChaîneConstruit(sJavascript,sFormNom)
    
    WebBrowserExtensions.ExecuteScriptAsync(goBrowser,sJavascript)
    Récupérer le résultat d'une fonction Javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    sJavascript est une chaîne
    sVal est une chaîne
     
    //Récupérer le contenu de la balise 'html' du document
    sJavascript = [
    document.getElementsByTagName('html')[0].innerHTML;
    ]
    EvaluateJsAsync(goBrowser,sJavascript)
    //La procédure Windev de gestion d'événement "EvaluateJsDone" est déclenchée lorsque le résultat est prêt.
     
    //Récupérer le contenu de tous les formulaires du document
    sJavascript = [
    (function() { 
    var elements = document.getElementsByTagName('form'); 
    var elementsList = ''; 
    for (var i = 0; i < elements.length; i++) { 
    	var element = elements[i]; 
    	elementsList += element.innerHTML; 
    	if (i < elements.length-1) 
    	{ 
    		elementsList += '<RC>'; 
    	} 
    } 
    return elementsList; })();
    ]
    EvaluateJsAsync(goBrowser,sJavascript)
    //La procédure Windev de gestion d'événement "EvaluateJsDone" est déclenchée lorsque le résultat est prêt.
    La procédure Windev "EvaluateJsAsync" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PROCEDURE EvaluateJsAsync(_oBrowser est un ChromiumWebBrowser, LOCAL _sJavascript est une chaîne)
     
    oFrame est CefFrameWrapper dynamique <- WebBrowserExtensions.GetMainFrame(_oBrowser)
    oWDJavascript:EvaluateJsAsync(oFrame,_sJavascript,0)
    La procédure Windev "EvaluateJsDone" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PROCEDURE EvaluateJsDone(_oWDJavascript est un WindevNet.WDJavascript <utile>,_oArgs est WindevNet.EvaluateJsDoneEventArgs)                         
     
    Info(_oArgs.sResult)
    Code C# de la dll WindevNet :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    using CefSharp;
    using System;
    using System.Threading.Tasks;
     
    namespace WindevNet
    {
        public class EvaluateJsDoneEventArgs : EventArgs
        {
            public int iID { get; set; }
            public string sResult { get; set; }
            public Task<JavascriptResponse> JavascriptResponse;
        }
     
        public class WDJavascript
        {
     
            public event EventHandler<EvaluateJsDoneEventArgs> EvaluateJsDone;
     
            protected virtual void OnEvaluateJsDone(EvaluateJsDoneEventArgs e)
            {
                EventHandler<EvaluateJsDoneEventArgs> handler = EvaluateJsDone;
                if (handler != null)
                {
                    handler(this, e);
                }
            }
     
            public void EvaluateJsAsync(IFrame f, string sJavascript,int iID=0)
            {
                f.EvaluateScriptAsync(sJavascript).ContinueWith(t =>
                {
                    var Response = t.Result;
                    EvaluateJsDoneEventArgs args = new EvaluateJsDoneEventArgs();
                    args.iID = iID;
                    args.sResult = (string)Response.Result.ToString();
                    args.JavascriptResponse = t;
                    OnEvaluateJsDone(args);
                });
            }
     
        }
     
    }

    Code C# de test de CefSharp :

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    using System;
    using System.Windows.Forms;
    using CefSharp;
    using CefSharp.WinForms;
     
    namespace CefTest
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                InitBrowser();
            }
     
            public ChromiumWebBrowser browser;
     
            public void InitBrowser()
            {
                Cef.Initialize(new CefSettings());
                browser = new ChromiumWebBrowser("www.google.com");
     
                browser.IsBrowserInitializedChanged -= new EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>(IsBrowserInitialized);
                browser.IsBrowserInitializedChanged += new EventHandler<CefSharp.IsBrowserInitializedChangedEventArgs>(IsBrowserInitialized);
     
                browser.FrameLoadEnd -= new EventHandler<CefSharp.FrameLoadEndEventArgs>(FrameLoadEnd);
                browser.FrameLoadEnd += new EventHandler<CefSharp.FrameLoadEndEventArgs>(FrameLoadEnd);
     
                browser.ConsoleMessage -= new EventHandler<CefSharp.ConsoleMessageEventArgs>(ConsoleMessage);
                browser.ConsoleMessage += new EventHandler<CefSharp.ConsoleMessageEventArgs>(ConsoleMessage);
     
                this.Controls.Add(browser);
                browser.Dock = DockStyle.Fill;
            }
     
            private void IsBrowserInitialized(object sender, IsBrowserInitializedChangedEventArgs e)
            {
                if (e.IsBrowserInitialized)
                {
                    //Do something here
                }
            }
     
            public string EvaluateJsResponse;
     
            public void EvaluateJs(IFrame f, string Js)
            {
                f.EvaluateScriptAsync(Js).ContinueWith(x =>
                {
                    var response = x.Result;
                    if (response.Success && response.Result != null)
                    {
                        EvaluateJsResponse = (string)response.Result.ToString();
                        //Do something here (To interact with the UI you must call BeginInvoke)
                    }
                });
            }
     
            public void FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
            {
                if (e.Frame.IsMain)
                {
                    //string sJs = "document.getElementsByTagName('html')[0].innerHTML;";
                    string sJs = "(function() { var body = document.body, html = document.documentElement; return  Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); })();";
                    EvaluateJs(e.Frame, sJs);
                }
            }
     
            public void ConsoleMessage(object sender, ConsoleMessageEventArgs e)
            {
                Console.WriteLine(e.Message);
            }
     
        }
    }

    En cas de problèmes d'intégration dans Windev, la solution peut être souvent de supprimer le répertoire .NET de votre projet, de vider son répertoire de compilation <NomProjet>.cpl et de recompiler le projet.

    Merci aux intervenants de ce fil : http://www.developpez.net/forums/d14...cation-windev/ et à ochoteau en particulier pour les sources.

    Bonne prog

  8. #8
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2015
    Messages : 28
    Par défaut Flash dans Chromium
    Bonjour,

    Tout d'abord merci pour ce fil et vos contributions. Même si le sujet date un peu maintenant, j'aimerais rouvrir la discussion.

    En effet, si le navigateur fonctionne dans la plupart des cas, il m'est impossible d'afficher du streaming vidéo. Flash fonctionne bien quant à lui. Avez-vous déjà rencontré ce problème et si oui avez-vous trouvé une solution?

    Merci pour votre aide.

    Cordialement,

    Laurence.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Expert sécurité informatique
    Inscrit en
    Mars 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert sécurité informatique

    Informations forums :
    Inscription : Mars 2021
    Messages : 6
    Par défaut super appli
    Bonjour, j'ai implanté CefSharp dans une fenêtre de mon appli, ça fonctionne impec.
    Me fallait un navigateur web et le champ HTML de windev (suis en version 24) était trop dépassé, il affichée pas les pages web de certain site.
    Par contre j'ai essayé de mettre à jour CefSharp a partir des liens que vous avez donné ici et ça ne fonctionne pas. Je suis en version 51 de chromium .
    Donc y a t il une mise à jour qui fonctionne, car quand je met à jour toutes les dll et fichier, et même en refaisant les Assemblage et le champ .Net et en recompilant
    windev me reconnais plus "Cef.Initialize()" il me dit que les paramètre de "Initialize" sont pas bon.
    Si je lance le "Go" en test de la fenêtre j'ai la fameuse erreur "Dump de l'erreur du module 'wd240net4.dll'".
    Avez vous une solution, car je voudrais bien le mettre à jour au moins en version 7.
    Merci d'avance

Discussions similaires

  1. [.NET / XAML] Chromium dans une application WinDev
    Par Gaautman dans le forum WinDev
    Réponses: 43
    Dernier message: 22/02/2017, 17h58
  2. [WD14] Comment insérer une animation flash dans une fenêtre Windev ?
    Par samoel24 dans le forum WinDev
    Réponses: 6
    Dernier message: 20/08/2013, 15h49
  3. Utilisé Tix dans une fenêtre crée avec Tkinter
    Par Jiyuu dans le forum Tkinter
    Réponses: 4
    Dernier message: 07/02/2008, 17h45
  4. [WINDEV 8] Lancer un exe dans une fenetre windev
    Par momobulle dans le forum WinDev
    Réponses: 7
    Dernier message: 30/08/2007, 13h42
  5. intégrer le résultat de sp_spaceused dans une table
    Par Labienus dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/11/2005, 09h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo