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

  1. #61
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut Debug
    Re bonjour,

    Ce n'est pas qu'il un fichier debug qui me gènait, c'est cette ligne d'erreur qui semblait indiquer que quelque chose a été mémorisé en dur le dossier de ton projet dans le code de mon appli :

    Unable to move cache folder C:\Mes Projets\_3pO_Chromium\Exe\v64\..\Cache Chromium to C:\Mes Projets\_3pO_Chromium\Exe\v64\..\old_Cache Chromium_000"

    A moins quelle ai été ajoutée dans le fichier debug lorsque j'ai testé ton projet, puis que j'aie copié le fichier debug dans le dossier de mon appli, avec son contenu. C'est possible. comme les lignes du debug n'ont pas de date c'est difficile à savoir.

    Plus simple, je vais supprimer le fichier debug et le laisser se renéréger...

    Crdlt
    Franck

  2. #62
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Dans mon projet, ce fichier n'est pas présent ... mais comme il est créé au moment de l'exécution, c'était donc le tien et je ne travaille pas sur C: et mes projets sont classés en plus par version de PCSoft parce que sinon c'est vite l'enfer !

    Il semblerait qu'il y ai un archivage du cache en automatique ... je crois que le plus simple est de se passer du fichier "debug.log" qui est de toute façon inutile dans un contexte "Client".

    Surtout que ce fichier "log" est crée à l'emplacement des DLL CefSharp ... il y a normalement peu de chance qu'un utilisateur lambda est un accès en écriture dans ce répertoire, enfin j'espère pour toi.

    Bon week-end

    [Edit] Je te confirme quand même que ce fichier peut être effacé et ne sert pas dans le fonctionnement de CefSharp

  3. #63
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut Gestion des instabilités...
    Bonjour,

    Mon appli intégrant le code de Patrick est à présent utilisée par une trentaine de personnes depuis une semaine. J'ai cependant un soucis mentionné par un utilisateur et que j'ai pu reproduire de mon coté mais que je ne sais pas trop comment gérer.

    Pour résumer, j'ai dans une fenêtre un onglet, dans celui ci un .NET dans lequel j'affiche CKEditor. Le code (PHP, JS,...) du CKEditor étant stocké coté serveur, donc appelé via url HTTP.
    Dans la même fenêtre j'ai un table avec ma liste d'articles. Quand on change de ligne dans cette table, il y a lecture d'une base de données et le contenu du CKEditor est remplacé par le texte HTML correspondant au nouvel article.

    Cela se fait avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FillCK(Javascript_ck,Mon_texte)
    Ma procédure FillCK:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PROCEDURE FillCK(obj_javascript,Texte_html est une chaîne="")
     
    //Remplacer le contenu 'html' de CKEditor
    sJavascript est une chaîne
    sJavascript = "CKEDITOR.instances.editora.setData('"+echapper_pour_CKeditor(Texte_html)+"');"
     
    Résultat est une chaîne 
    QUAND EXCEPTION DANS
    	Résultat = obj_javascript.Avec_Attente(sJavascript)
    FAIRE
    	Error("Une erreur a été rencontrée lors de la lecture ou l'écriture du contenu de l'éditeur HTML."+" (FillCK)")
     
    FIN
    Quel est mon soucis ? Simplement que de temps en temps (parfois après avoir navigué dans la table une bonne centaine de fois sans problème), l'exception se produit, avec affichage du message d'erreur.
    Lorsque cela survient, plus moyen d'en sortir, tout les essais de remplissage du CKEdito suivent échouent de la même manière. En fait le CKEditor est planté et plus moyen de le réactiver.
    Même un CK_mon_ck.Load ne suffit pas pour le débloquer.

    1/Par quel moyen ou méthode peut on récupérer plus d'infos sur ce qui a fait générer l'exception (avec l'idée de l'empêcher, mais ça risque d'être difficile car je n'ai pas le code des dll)
    Info complémentaire, je n'arrive pas à reproduire ce défaut en mode GO (environnement de dev Windev), mais uniquement depuis une instance du programme une fois installé sur un poste de travail.

    2/Comment faire (quel code insérer) juste après (ou à la place de) l'affichage de l'erreur, donc quand l'exception est détectée, pour ré-initialiser complétement le navigateur et le recharger le CK ?

    Merci pour votre aide.

    Crdlt
    Franck

    PS: Je pense que c'est sans aucun rapport, mais dans le fichier debug, j'ai ceci:
    [0809/103808:ERROR:cache_creator.cc(127)] Unable to create cache
    [0809/103808:ERROR:shader_disk_cache.cc(588)] Shader Cache Creation failed: -2
    [0809/103808:ERROR:cache_creator.cc(127)] Unable to create cache
    [0809/103809:INFO:CONSOLE(0)] "/deep/ combinator is deprecated. See https://www.chromestatus.com/features/6750456638341120 for more details.", source: (0)
    [0809/103809:INFO:CONSOLE(288)] "Uncaught (in promise) TypeError: Cannot read property 'getStrings' of undefined", source: chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai/pdf.js (288)
    [0809/103810:ERROR:ipc_channel_win.cc(207)] pipe error: 109

  4. #64
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Bonjour Franck,

    Il est possible que ce soit le "pipe error" ... en gros plus de lien entre le navigateur instancié et l'objet dans ton code, enfin quelque chose dans ce style.

    Fais l'essai suivant :

    1°) Change la création de l'objet Navigateur en objet dynamique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Navigateur est un CefSharp.WinForms.ChromiumWebBrowser dynamique
    Navigateur = allouer un ChromiumWebBrowser(URL_Demandée)
    2°) Quand tu détectes ton embrouille ... Tu réinitialises l'objet Navigateur, tu repars ainsi de zéro.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // On supprime le parent
    Navigateur.Parent = Null
     
    // Initialisation du navigateur
    libérer Navigateur
    Navigateur = allouer un ChromiumWebBrowser(URL_Demandée)
     
    // Mise en place de l'affichage dans le champ
    Navigateur.Parent = DotNet_Chromium
    Avec ça, tu vas réinitialiser ton navigateur ... ça ne peut que fonctionner !

    Have a good day.

    [EDIT] Si tu peux mettre l'exception que tu as en clair ... ExceptionInfo(errComplet)

  5. #65
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Merci pour cette solution, c'est exactement ce que je cherchais.

    Attention il faut aussi déclarer dynamiquement le javascript associé au navigateur et le libérer et le réallouer juste après avoir réalloué le navigateur. Sinon le FillCk ne rempli plus le bon objet et rien ne s'affiche dans éditeur. J'ai mis un moment avant de comprendre cela et c'est pour ça que j'ai tardé à te répondre.

    Je viens de faire une série de tests, ça fonctionne, j'arrive bien à réinitialiser le navigateur et le CKEditor lorsque le plantage se produit.
    Voici le message de retour de l'exception:
    Appel WL :
    Traitement de 'Procédure locale FillCK' (FEN_MAIN.PROCEDURE.FillCK), ligne 30, thread 0

    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 'wd200net4.dll' (20.0.8.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.AggregateException: Une ou plusieurs erreurs se sont produites. ---> System.AggregateException: Une ou plusieurs erreurs se sont produites. ---> System.Threading.Tasks.TaskCanceledException: Une tâche a été annulée.
    --- Fin de la trace de la pile d'exception interne ---
    à System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
    à System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
    à System.Threading.Tasks.Task`1.get_Result()
    à _3pO.Javascript.<>c__DisplayClass5.<Avec_Attente>b__3(Task`1 t)
    à System.Threading.Tasks.ContinuationTaskFromResultTask`1.InnerInvoke()
    à System.Threading.Tasks.Task.Execute()
    --- Fin de la trace de la pile d'exception interne ---
    à _3pO.Javascript.Avec_Attente(String Script, Int32 Millisec)
    à _3pO.Javascript.Avec_Attente(String Script)
    --- Fin de la trace de la pile d'exception interne ---
    à System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
    à System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
    à System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
    à System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams)
    à CDotNetType.bInvoke(CDotNetType* , Object gcrObj, Char* pszNomMethode, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
    à CDotNetType.bInvoke(CDotNetType* , Object gcrObj, STMethodeDotNet* pstMethode, UInt32* pdwIdentifiant, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
    à CDotNetInstance.bAppelleMethode(CDotNetInstance* , STMethodeDotNet* pstMethode, UInt32* pdwIdentifiant, CSLevel* pclPile, Int32 nNbParamPile, Int32 bValeurRetour, STOperationDotNet* pstOperation)
    Informations supplémentaires :
    EIT_PILEWL :
    Procédure locale FillCK (FEN_MAIN.PROCEDURE.FillCK), ligne 30
    Du chinois pour moi.



    Un autre point, entre l'allocation du navigateur (ou son chargement avec un .load) et le premier FillCk, je suis obligé d'insérer une pause d'une seconde. En effet si le CKEditor (ou le navigateur je ne sais pas trop) n'a pas fini de se charger, le FillCk ne fonctionne pas (CK vide).

    Pour éviter cette pause, il y a t'il un moyen "d'attendre" ou détecter la fin du chargement du navigateur et du CKEditor ?


    Crdlt
    Franck

  6. #66
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Ah effectivement, j'avais oublié le Javascript ... je l'ai intégré dans mon projet de démonstration.

    Concernant l'exception, et bien le plantage a lieu au moment de la récupération du résultat de la commande Javascript. Vu que tu indiques que tout marche très bien et qu'à un moment, ça plante .... je pense que le problème est dans CefSharp, l'histoire du canal de communication (pipeline). Donc dans l'idéal, c'est de réinitialisé le navigateur comme je te l'ai indiqué.

    Pour ton problème d'attente ... il faut que tu utilises "IsLoading".

    Ça donne un code dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Chargement de l'URL
    Navigateur.Load("Ton URL")
     
    // On attend que la page soit chargée
    TANTQUE Navigateur.IsLoading
    	ThreadPause(1)
    FIN
    Bon weekend, Patrick

  7. #67
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    Chez moi ça ne fonctionne pas. IsLoading passe tout de suite à faux. Le FillCk ne donne rien si je l'exécute immédiatement après. Pas grave, je vais laissez ma tempo d'une seconde car ce n'est pas à chaque affichage, mais uniquement pour le premier.

    Sinon voila le code qui ne fonctionne pas :

    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
     
    // On supprime le parent
    NAV_description_category.Parent = Null
     
    // Initialisation du navigateur
    libérer NAV_description_category
    NAV_description_category = allouer un ChromiumWebBrowser(ChaîneConstruit(URL_Demandée,SAI_taile_description_category,my_URL_param_encode(ck_location),page_type,ck_lang))
     
     
    // Mise en place de l'affichage dans le champ
    NAV_description_category.Parent = WinForm3
    libérer Javascript_description_category
    Javascript_description_category = allouer un Javascript(NAV_description_category)
     
     
    // On attend que la page soit chargée (maxi 5 sec)
    compteur_pause est un entier=0
    TANTQUE (NAV_description_category.IsLoading _ET_ PAS NAV_description_category.Visible _ET_ compteur_pause<500) 
    	ThreadPause(1) 
    	compteur_pause ++
    FIN
     
    SI compteur_pause<500 _ET_ BTN_Lien_description_category..Enfoncé=Vrai _ET_ TableSelectOccurrence(TABLE_ps_category)=1 ALORS
    	//rafraichissement
    	SI sContenu_avant_description_category<>"-1" ALORS FillCK(Javascript_description_category,sContenu_avant_description_category)
    FIN
    Et le code qui "fonctionne", mais n'est pas optimisé:
    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
     
    // On supprime le parent
    NAV_description_category.Parent = Null
     
    // Initialisation du navigateur
    libérer NAV_description_category
    NAV_description_category = allouer un ChromiumWebBrowser(ChaîneConstruit(URL_Demandée,SAI_taile_description_category,my_URL_param_encode(ck_location),page_type,ck_lang))
     
     
    // Mise en place de l'affichage dans le champ
    NAV_description_category.Parent = WinForm3
    libérer Javascript_description_category
    Javascript_description_category = allouer un Javascript(NAV_description_category)
     
     
    // On attend que la page soit chargée 
    temporisation(100)
     
    SI BTN_Lien_description_category..Enfoncé=Vrai _ET_ TableSelectOccurrence(TABLE_ps_category)=1 ALORS
    	//rafraichissement
    	SI sContenu_avant_description_category<>"-1" ALORS FillCK(Javascript_description_category,sContenu_avant_description_category)
    FIN
    A+
    Franck

  8. #68
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    OK je viens de tester de nouveau et effectivement, je n'ai plus le même fonctionnement, bizarre !

    J'ai donc regardé et voici ce qu'il convient de faire :

    Ajouter l'évènement "LoadingStateChanged " et déclarer Page_IsLoading

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ...
     
    // Déclaration d'un objet Navigateur
    Navigateur est un ChromiumWebBrowser dynamique
     
    // Mise en place des événements
    Navigateur.LoadingStateChanged = Evt_LoadingStateChanged
     
    // Permet de savoir si la page est chargée
    Page_IsLoading est un booléen
     
    ...
    Procédure Evt_LoadingStateChanged :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Résumé : <indiquez ici ce que fait la procédure>
    PROCEDURE PUBLIQUE Evt_LoadingStateChanged(Appelant est un ChromiumWebBrowser <utile>,Param est un LoadingStateChangedEventArgs)
     
    // Changement d'état du chargement
    Page_IsLoading = Param.IsLoading
    Code pour le chargement d'une page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // Indique que la page est en chargement
    Page_IsLoading = Vrai
     
    // Chargement de l'URL
    Navigateur.Load(Champ_URL)
     
    // On attend que le navigateur charge la page avant de redonner la main
    TANTQUE Page_IsLoading
    	ThreadPause(1)
    FIN
     
    Trace("OK - Page Chargée")

  9. #69
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Merci pour ta réponse rapide.

    Mais ça ca ne peut pas marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Mise en place des événements
    Navigateur.LoadingStateChanged = Evt_LoadingStateChanged
    Car
    1- Evt_LoadingStateChanged attend deux arguments. Je comprends que le premier est le nom du navigateur, mais je ne vois pas trop ce que je dois lui passer comme second paramètre.
    2- ne retourne rien

    J'ai adapté le truc, mais ça ne donne rien de mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Mise en place des événements
    Evt_LoadingStateChanged(NAV_description_category)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROCEDURE Evt_LoadingStateChanged(Appelant est un ChromiumWebBrowser <utile>)
     
    // Changement d'état du chargement
    Page_IsLoading_category = Appelant.LoadingStateChanged
    Je vois bien Page_IsLoading_category qui passe de vrai à faux (donc peut être que ça fonctionne en fait). Mais c'est trop rapide, le FillCK qui suit ne fonctionne pas, sauf si j'ajoute une tempo avant. Je me demande si ce n'est pas plutôt la fin de l'initialisation ou affichage du CKEditor qu'il faut détecter (et non pas de la page).

    Cordialement
    Franck

  10. #70
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Je t'ai bien donné le deuxième paramètre pourtant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Résumé : <indiquez ici ce que fait la procédure>
    PROCEDURE PUBLIQUE Evt_LoadingStateChanged(Appelant est un ChromiumWebBrowser <utile>,Param est un LoadingStateChangedEventArgs)
    et dans ton événement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Changement d'état du chargement
    Page_IsLoading = Param.IsLoading
    [Humour] Il va falloir que tu progresses en Copier/Coller ! [/Humour]

    Citation Envoyé par bugnet Voir le message
    ...

    le FillCK qui suit ne fonctionne pas, sauf si j'ajoute une tempo avant. Je me demande si ce n'est pas plutôt la fin de l'initialisation ou affichage du CKEditor qu'il faut détecter (et non pas de la page).

    ...
    Alors ça c'est possible, le "IsLoading" te permet théoriquement de savoir quand la page est disponible donc chargé entièrement mais peut-être pas encore totalement initialisée.

    Si tu ajoutes l'attente au moment du Load, on voit bien un décalage entre le moment du load et le retour du IsLoading. Néanmoins, on dirait que le "renderrer" (rendu écran) arrive juste quelques millisecondes après.

    Il faudra donc peut-être ajouter un test pour savoir si CKEditor est disponible ... genre demander le source ou un truc dans ce style et attendre selon sa réponse.

    Merci pour ton retour car je pense bien intégrer ce CKEditor à la place de mon automation "IE" ... qui fonctionne très bien mais manque de fonctionnalités !

  11. #71
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par lemazol Voir le message
    Je t'ai bien donné le deuxième paramètre pourtant :

    // Résumé : <indiquez ici ce que fait la procédure>
    PROCEDURE PUBLIQUE Evt_LoadingStateChanged(Appelant est un ChromiumWebBrowser <utile>,Param est un LoadingStateChangedEventArgs)

    et dans ton événement :

    // Changement d'état du chargement
    Page_IsLoading = Param.IsLoading

    [Humour] Il va falloir que tu progresses en Copier/Coller ! [/Humour]
    Je prend le risque de passer pour le crétin de service, mais j'insiste, je ne vois pas comment il est possible d'appeler la procédure ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Navigateur.LoadingStateChanged = Evt_LoadingStateChanged
    Alors que d'après sa définition elle attend deux paramètres et ne retourne aucune valeur.

    Crdlt
    Franck

  12. #72
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Bonjour Franck,

    Je vois effectivement que tu n'as pas vu comment fonctionne les événements sur les .Net

    Explication :

    Tu déclares ton objet .Net, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Allocation d'un nouvel objet Navigateur
    Navigateur = allouer un ChromiumWebBrowser(URL_Demandée)
    Ensuite tu dis à ton objet (Navigateur dans notre cas), que quand il reçoit un événement de type Evénement_X, il doit le faire via le code Procédure_Y avec Z paramètres.

    Ce qui donne : Navigateur.Evénement_X = Procédure_Y où Procédure_Y accepte Z paramètres, du genre : PROCEDURE Procédure_Y(Param1,Param2)

    Donc, dans le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Mise en place des événements
    Navigateur.AddressChanged = Evt_Changement_URL
    Navigateur.TitleChanged = Evt_Changement_Titre
    Navigateur.LoadingStateChanged = Evt_LoadingStateChanged
    Les événements "AddressChanged" sont gérés par la procédure "Evt_Changement_URL"
    Les événements "TitleChanged" sont gérés par la procédure "Evt_Changement_Titre"
    Les événements "LoadingStateChanged" sont gérés par la procédure "Evt_LoadingStateChanged"

    Les événements sont justement des événements, tu ne sais pas quand ils arrivent et c'est donc l'application maitre qui s'occupe de te les envoyer. A chaque fois qu'un événement est reçu, la procédure correspondante est lancée avec les paramètres.

    Dans l'événement que je t'ai donnée : LoadingStateChanged, c'est donc la procédure "Evt_LoadingStateChanged" qui va se lancer avec 2 paramètres : un ChromiumWebBrowser et un LoadingStateChangedEventArgs. Ce qui donne en déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PROCEDURE PUBLIQUE Evt_LoadingStateChanged(Appelant est un ChromiumWebBrowser <utile>,Param est un LoadingStateChangedEventArgs)
    Ce que j'ai appelé "Appelant" est celui qui appelle ton événement donc un de tes objets "Navigateur" (je rappelle que tu peux avoir plusieurs navigateurs en simultané) et Param contient les paramètres de l'événement. Param dans ce cas contient isLoading qui va donc changer d'état (passage de Vrai à Faux ou inversement).

    Voilà j'espère que pour toi, c'est plus clair.

    C'est une méthode rapide d'allocation de procédure sur des événements, mais il existe une autre méthode plus compliquée à mon goût mais peut-être plus claire pour toi avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Résultat> = DotNetDélégué(<Procédure WLangage> , <Type du délégué>)
    A noter que tu peux également enchainer l'appel des procédures sur des événements en utilisant le += ... du genre : Navigateur.LoadingStateChanged += Autre_Procédure

    Est-ce bon pour toi ?

  13. #73
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Citation Envoyé par lemazol Voir le message
    Est-ce bon pour toi ?
    J'étais absent depuis plusieurs jours, je vois ta réponse détaillée que maintenant. Je relis cela à tête reposée et te le confirme.
    Merci en tous cas d'avoir pris le temps de tout expliquer.

    Crdlt
    Franck

  14. #74
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut Désactiver le correcteur ortho de Chrome
    Bonjour,

    Je me tire les cheveux la dessus depuis des heures : un des utilisateurs de mon appli (CKEditor dans Chrome dans Windev) se plaint que lorsque il passe CKEditor en mode code source (bouton "source"), le texte devient complétement souligné en rouge, quasi illisible. Son texte est en français et le correcteur cherche à corriger de l'anglais.

    Après avoir essayé tout et son contraire dans la config de CKEditor pour paramétrer le correcteur d'orthographe, je viens seulement de comprendre que lorsque celui ci affiche le code source, c'est en fait le correcteur d'orthographe intégré à Chromium qui entre en jeux (CKEditor n'a plus rien à voir la dedans). On peut le voir en ouvrant la page de démo de CKEditor dans Chrome : http://ckeditor.com/demo et en cliquant sur "source". Un clic droit dans le texte permet ensuite de désactiver le correcteur DE CHROME.

    Mais avec Chromium dans Windev, le clic droit est intercepté par Windev et on ne n'a donc pas accès aux réglages de chrome.

    Bref je voudrais juste désactiver le correcteur de Chrome dans mon appli, et je ne trouve pas comment faire. Peut être un paramètre à passer lors de son ouverture ?

    Crdlt
    Franck

  15. #75
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Bonjour Franck,

    Sur mon poste de test (avec ma version de démo en version 21), je n'ai pas de problème de correcteur.
    A noter que je n'ai pas de Microsoft Word sur ce poste.

    Je ne pense pas que tu puisses désactiver le "spell checker" dans "Cef Sharp", c'est en fait le "spell checker" qui vient par dessus ton browser.

    Essaye de mettre ce genre de ligne dans le code HTML de ton éditeur "CK Editor" :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <tag autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>

    ou d'utiliser spellcheck=false, comme c'est indiqué dans le HTML5

    Autre solution : changer le code langue de la page afin que le correcteur passe dans la bonne langue.

    Le clic droit n'est pas intercepté par Windev .... mais par ton "CKEditor". Un clic droit dans CefSharpo te donne "Back, Forward, Print et View source"

    Merci pour ton retour ...

    Patrick

    [Remarque]Ne tire pas trop sur tes cheveux sinon tu vas ressembler à Bruce Willis ![/Remarque]

  16. #76
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Merci de m'aider une fois encore... Qq c'est compliqué cet empilement de code...

    Bon j'ai essayé les deux sans plus de résultat:
    Citation Envoyé par lemazol Voir le message
    Essaye de mettre ce genre de ligne dans le code HTML de ton éditeur "CK Editor" :
    <tag autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
    n'a aucun effet.

    Et j'ai essayé ça, mais ça ne fait rien non plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sJavascript est une chaîne
    sJavascript = "CKEDITOR.instances.editora.spellcheck=false;"
    sJavascript += "CKEDITOR.instances.editora.setData('"+echapper_pour_CKeditor(Texte_html)+"');"
    Résultat = obj_javascript.Avec_Attente(sJavascript)
    Autre solution : changer le code langue de la page afin que le correcteur passe dans la bonne langue.
    J'y ai bien pensé, mais comment peut-on faire ça ?

    Attention, j'ai bien précisé que le problème n'était présent que quand le bouton "Source" du CKEditor est enfoncé. En mode WYSIWYG je n'ai pas ce soucis car je sais comment dire au CKEditor quelle est la langue du texte et activer ou pas son correcteur.

    Le clic droit n'est pas intercepté par Windev .... mais par ton "CKEditor". Un clic droit dans CefSharpo te donne "Back, Forward, Print et View source"
    Oui sauf que un clic droit dans un CKEditor depuis Chrome ou Firefox, lorsque CKEditor est en mode "source", me donne justement un menu qui permet de désactiver le correcteur ou changer sa langue. le même clic droit sur le CKeditor en mode source depuis Windev, me donne un autre menu avec des fonctions copier coller et juste une fonction d'ajout des mots au dictionnaire, mais rien pou en choisir la langue ou le désactiver.

    Crdlt
    Franck

  17. #77
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 36
    Points : 44
    Points
    44
    Par défaut
    Ah par contre ça ça semble fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj_javascript.Avec_Attente("document.body.spellcheck=false;")
    Je pousse les essais et confirme plus tard.

    [EDIT]: Je confirme, ça marche bien (plus de correcteur sur le texte source) si on envoie cet ordre js juste avant de faire les SetData.

    Cordialement,
    Franck

  18. #78
    Futur Membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Janvier 2015
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    Tout d'abord merci pour ce fil et vos contributions.

    Je cherche à activer la possibilité de télécharger un fichier. J'ai cherché du coté de "DownloadHandler" mais je n'arrive pas à implémenter la fonction. Quelqu'un a-t-il déjà réussi ?

    Merci d'avance.
    Loïc

  19. #79
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2016
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2016
    Messages : 29
    Points : 36
    Points
    36
    Par défaut
    Bonjour,

    Tu ne peux pas l'utiliser directement sous Windev ... il faut l'implémenter en C++ afin de pouvoir l'utiliser sous Windev.

    C'est la seule méthode pour que cela fonctionne enfin à ma connaissance.

  20. #80
    Membre actif
    Inscrit en
    Août 2005
    Messages
    96
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 96
    Points : 205
    Points
    205
    Par défaut CefSharp et Windev : Téléchargement d'un fichier avec IDownloadHandler
    Citation Envoyé par LoicOuest Voir le message
    Bonjour,

    Tout d'abord merci pour ce fil et vos contributions.

    Je cherche à activer la possibilité de télécharger un fichier. J'ai cherché du coté de "DownloadHandler" mais je n'arrive pas à implémenter la fonction. Quelqu'un a-t-il déjà réussi ?

    Merci d'avance.
    Loïc
    Bonjour Loic,

    Il faut effectivement implémenter l'interface de gestion des téléchargements IDownloadHandler dans le code C#.
    Cf ici : https://github.com/cefsharp/CefSharp...loadHandler.cs

    J'ai modifié la dll WindevNet.dll pour ajouter cette possibilité. A télécharger ici : WindevNet.7z.

    Attention, la dll a été compilée avec CefSharp v 51 dispo ici : https://mon-partage.fr/f/G2zk0QXT/

    En Windev, cela fonctionne de cette façon :

    1/Code d'initialisation de la fenêtre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SI PAS Cef.IsInitialized ALORS
    	Cef.Initialize()
    FIN
     
    goBrowser est un ChromiumWebBrowser("http://google.com")
     
    oDownloadHandler est un WindevNet.DownloadHandler dynamique
    oDownloadHandler <- allouer un WindevNet.DownloadHandler
    goBrowser.set_DownloadHandler(oDownloadHandler)
     
    //Event_OnDownloadUpdated est une procédure locale à la fenêtre
    oDownloadHandler.add_OnDownloadUpdatedEvent(DotNetDélégué(Event_OnDownloadUpdated,"EventHandler<WindevNet.OnDownloadUpdatedEventArgs>"))
    2/En fin d'initialisation de la fenêtre

    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
    3/Procédure de gestion de l’événement Event_OnDownloadUpdated (procédure locale à la fenêtre)

    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
     
    PROCEDURE Event_OnDownloadUpdated(Src,Args est un OnDownloadUpdatedEventArgs)
    //https://github.com/cefsharp/CefSharp/blob/master/CefSharp/DownloadItem.cs
    sErreur est une chaîne
    SI Src = Null _OU_ Args = Null _OU_ Args.ToString() <> "WindevNet.OnDownloadUpdatedEventArgs" ALORS
    	sErreur = Args.ToString()
    	RENVOYER Void
    FIN
     
    QUAND EXCEPTION DANS
    	iPourcentage est un entier
    	sPath est une chaîne
    	sSuggestedFileName est une chaîne
    	iPourcentage 		= Args.downloadItem.get_PercentComplete()
    	sPath 				= Args.downloadItem.get_FullPath()
    	sSuggestedFileName 	= Args.downloadItem.SuggestedFileName 
     
    	SI Args.downloadItem.IsComplete _OU_ Args.downloadItem.IsCancelled ALORS
    		//Faire quelque chose
    	SINON
    		SI Args.downloadItem.IsInProgress ALORS
    			//Faire quelque chose
    		FIN
    	FIN 
    FAIRE
    	Erreur(sErreur+RC+RC+ExceptionInfo(errComplet))
    FIN
    RENVOYER Void
    Code C# de la dll WindevNet.dll :

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
     
    using CefSharp;
    using CefSharp.Internals;
    using CefSharp.WinForms;
    using System;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Net;
    using System.Threading.Tasks;
     
    namespace WindevNet
    {
     
        public class EvaluateJsDoneEventArgs : EventArgs
        {
            public string sID { get; set; }
            public string sResult { get; set; }
            public Task<JavascriptResponse> JavascriptResponse;
        }
     
        public class WDBrowser
        {
            public ChromiumWebBrowser browser;
     
            public ChromiumWebBrowser GetBrowser(string sUrl)
            {
                Cef.Initialize(new CefSettings());
                browser = new ChromiumWebBrowser(sUrl);
                return browser;
            }
     
        }
     
        public class WDJavascript
        {
     
            public event EventHandler<EvaluateJsDoneEventArgs> EvaluateJsDone;
     
            protected virtual void OnEvaluateJsDone(EvaluateJsDoneEventArgs args)
            {
                EventHandler<EvaluateJsDoneEventArgs> handler = EvaluateJsDone;
                if (handler != null && this != null && args != null)
                {
                    try
                    {
                        handler(this, args);
                    }
                    catch (System.Exception e)
                    {
                        e.ToString();
                    }
                }
            }
     
            public void EvaluateJsAsync(IFrame f, string sJavascript,string sID="")
            {
                f.EvaluateScriptAsync(sJavascript).ContinueWith(t =>
                {
                    var Response = t.Result;
                    EvaluateJsDoneEventArgs args = new EvaluateJsDoneEventArgs();
                    args.sID = sID;
                    args.sResult = (string)Response.Result.ToString();
                    args.JavascriptResponse = t;
                    OnEvaluateJsDone(args);
                });
            }
     
     
     
        }
     
        //--------------------------------------------------------------------
        //Implémentation de l'interface de gestions des requêtes
     
        public class OnBeforeBrowseEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public IRequest request { get; set; }
            public bool isRedirect { get; set; }
            public bool bok { get; set; }
        }
        public class OnCertificateErrorEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public CefErrorCode errorCode { get; set; }
            public string requestUrl { get; set; }
            public ISslInfo sslInfo { get; set; }
            public IRequestCallback callback { get; set; }
            public bool bok { get; set; }
        }
        public class OnBeforeResourceLoadEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public IRequest request { get; set; }
            public IRequestCallback callback { get; set; }
            public int iReturn { get; set; }
        }
        public class OnResourceRedirectEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public IRequest request { get; set; }
            public string newUrl { get; set; }
        }
        public class OnResourceResponseEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public IRequest request { get; set; }
            public IResponse response { get; set; }
            public bool bok { get; set; }
        }
        public class OnOpenUrlFromTabArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public string targetUrl { get; set; }
            public WindowOpenDisposition targetDisposition { get; set; }
            public bool userGesture { get; set; }
            public bool bok { get; set; }
        }
        public class OnPluginCrashedEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public string pluginPath { get; set; }
        }
        public class GetAuthCredentialsEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public bool isProxy { get; set; }
            public string host { get; set; }
            public int port { get; set; }
            public string realm { get; set; }
            public string scheme { get; set; }
            public IAuthCallback callback { get; set; }
            public bool bok { get; set; }
        }
        public class OnRenderProcessTerminatedEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public CefTerminationStatus status { get; set; }
        }
        public class OnQuotaRequestEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public string originUrl { get; set; }
            public long newSize { get; set; }
            public IRequestCallback callback { get; set; }
            public bool bok { get; set; }
        }
        public class OnProtocolExecutionEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public string url { get; set; }
            public bool bok { get; set; }
        }
        public class OnRenderViewReadyEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
        }
        public class OnResourceLoadCompleteEventArgs : EventArgs
        {
            public IWebBrowser browserControl { get; set; }
            public IBrowser browser { get; set; }
            public IFrame frame { get; set; }
            public IRequest request { get; set; }
            public IResponse response { get; set; }
            public UrlRequestStatus status { get; set; }
            public long receivedContentLength { get; set; }
        }
     
        public class BrowserRequestHandler : IRequestHandler
        {
            //public string Cookies;
            //https://github.com/cefsharp/CefSharp/blob/master/CefSharp/IRequestHandler.cs
     
            public static readonly string VersionNumberString = String.Format("Chromium: {0}, CEF: {1}, CefSharp: {2}",
                Cef.ChromiumVersion, Cef.CefVersion, Cef.CefSharpVersion);
     
            public event EventHandler<OnBeforeBrowseEventArgs> OnBeforeBrowseEvent;
            public event EventHandler<OnCertificateErrorEventArgs> OnCertificateErrorEvent;
            public event EventHandler<OnBeforeResourceLoadEventArgs> OnBeforeResourceLoadEvent;
            public event EventHandler<OnResourceRedirectEventArgs> OnResourceRedirectEvent;
            public event EventHandler<OnResourceResponseEventArgs> OnResourceResponseEvent;
            public event EventHandler<OnOpenUrlFromTabArgs> OnOpenUrlFromTabEvent;
            public event EventHandler<OnPluginCrashedEventArgs> OnPluginCrashedEvent;
            public event EventHandler<GetAuthCredentialsEventArgs> GetAuthCredentialsEvent;
            public event EventHandler<OnRenderProcessTerminatedEventArgs> OnRenderProcessTerminatedEvent;
            public event EventHandler<OnQuotaRequestEventArgs> OnQuotaRequestEvent;
            public event EventHandler<OnProtocolExecutionEventArgs> OnProtocolExecutionEvent;
            public event EventHandler<OnRenderViewReadyEventArgs> OnRenderViewReadyEvent;
            public event EventHandler<OnResourceLoadCompleteEventArgs> OnResourceLoadCompleteEvent;
     
            //----------------------------------------------------
     
            bool IRequestHandler.OnBeforeBrowse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, bool isRedirect)
            {
                /*
                <summary> 
                Called before browser navigation. 
                If the navigation is allowed <see cref="IWebBrowser.FrameLoadStart"/> and <see cref="IWebBrowser.FrameLoadEnd"/> 
                will be called. If the navigation is canceled <see cref="IWebBrowser.LoadError"/> will be called with an ErrorCode 
                value of <see cref="CefErrorCode.Aborted"/>.  
                </summary> 
                <param name="browserControl">the ChromiumWebBrowser control</param> 
                <param name="browser">the browser object</param> 
                <param name="frame">The frame the request is coming from</param> 
                <param name="request">the request object - cannot be modified in this callback</param> 
                <param name="isRedirect">has the request been redirected</param> 
                <returns>Return true to cancel the navigation or false to allow the navigation to proceed.</returns> 
                */
                //EventHandler<OnBeforeBrowseEventArgs> handler = OnBeforeBrowseEvent;
                OnBeforeBrowseEventArgs args = new OnBeforeBrowseEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.request = request;
                args.bok = false;
                args.isRedirect = isRedirect;
                if (OnBeforeBrowseEvent != null && this != null && args != null)
                {
                    OnBeforeBrowseEvent(this, args);
                    return args.bok;
                }
                return false;
            }
     
            //----------------------------------------------------
     
            bool IRequestHandler.OnCertificateError(IWebBrowser browserControl, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
            {
                /*
                public boolean onCertificateError(CertificateErrorParams params)
                Allows using problematic SSL certificates.Returns false.
                Specified by:
                onCertificateError in interface LoadHandler
                Parameters:
                params - provides information about problematic SSL certificate.
                Returns:
                true if loading must be canceled and false if you ignore SSL certificate error and want to load the required resource.
                */
                //EventHandler<OnCertificateErrorEventArgs> handler = OnCertificateErrorEvent;
                OnCertificateErrorEventArgs args = new OnCertificateErrorEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.errorCode = errorCode;
                args.requestUrl = requestUrl;
                args.sslInfo = sslInfo;
                args.callback = callback;
                args.bok = false;
                if (OnCertificateErrorEvent != null && this != null && args != null)
                {
                    OnCertificateErrorEvent(this, args);
                    return args.bok;
                }
                return false;
            }
     
            //----------------------------------------------------
     
            //EventHandler<OnBeforeResourceLoadEventArgs> handlerOnBeforeResourceLoad;// = OnBeforeResourceLoadEvent;
     
            //public delegate void OnBeforeResourceLoadEventHandler(object sender, OnBeforeResourceLoadEventArgs arg);
            //public event OnBeforeResourceLoadEventHandler OnBeforeResourceLoadEvent;
            CefReturnValue IRequestHandler.OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
            {
                // For some reason, in order to set cookies manually using a hdeader you need to clear the real cookies every time :/
                /*
                Cef.GetGlobalCookieManager().VisitAllCookies(new DeleteAllCookiesVisitor());
                if (request.Url.StartsWith("steammobile://"))
                {
                    // Cancel all steammobile:// requests (for the app)
                    return CefReturnValue.Cancel;
                }
                else
                {
                    var headers = request.Headers;
                    headers.Add("Cookie", Cookies);
                    headers.Add("X-Requested-With", "com.valvesoftware.android.steam.community");
                    request.Headers = headers;
                    return CefReturnValue.Continue;
                }
                */
     
                //EventHandler<OnBeforeResourceLoadEventArgs> handler = OnBeforeResourceLoadEvent;
                //OnBeforeResourceLoadEventHandler handler = OnBeforeResourceLoadEvent;
                //handlerOnBeforeResourceLoad = OnBeforeResourceLoadEvent;
                OnBeforeResourceLoadEventArgs args = new OnBeforeResourceLoadEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.request = request;
                args.callback = callback;
                args.iReturn = 1;
                if (OnBeforeResourceLoadEvent != null && this != null && args != null)
                {
                    OnBeforeResourceLoadEvent(this, args);
                    switch (args.iReturn)
                    {
                        case 0:
                            return CefSharp.CefReturnValue.Cancel;
                        case 1:
                            return CefSharp.CefReturnValue.Continue;
                        case 2:
                            return CefSharp.CefReturnValue.ContinueAsync;
                        default:
                            return CefSharp.CefReturnValue.Continue;
                    }
     
                }
                return CefSharp.CefReturnValue.Continue;
            }
     
            //----------------------------------------------------
     
            void IRequestHandler.OnResourceRedirect(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, ref string newUrl)
            {
                //EventHandler<OnResourceRedirectEventArgs> handler = OnResourceRedirectEvent;
                OnResourceRedirectEventArgs args = new OnResourceRedirectEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.request = request;
                args.newUrl = newUrl;
                if (OnResourceRedirectEvent != null && this != null && args != null)
                {
                    OnResourceRedirectEvent(this, args);
                }
            }
     
            //----------------------------------------------------
     
            bool IRequestHandler.OnResourceResponse(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
            {
                //EventHandler<OnResourceResponseEventArgs> handler = OnResourceResponseEvent;
                OnResourceResponseEventArgs args = new OnResourceResponseEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.request = request;
                args.response = response;
                args.bok = false;
                if (OnResourceResponseEvent != null && this != null && args != null)
                {
                    OnResourceResponseEvent(this, args);
                    return args.bok;
                }
                return false;
            }
     
            //----------------------------------------------------
     
            public bool OnOpenUrlFromTab(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, WindowOpenDisposition targetDisposition, bool userGesture)
            {
                //EventHandler<OnOpenUrlFromTabArgs> handler = OnOpenUrlFromTabEvent;
                OnOpenUrlFromTabArgs args = new OnOpenUrlFromTabArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.targetUrl = targetUrl;
                args.targetDisposition = targetDisposition;
                args.userGesture = userGesture;
                args.bok = false;
                if (OnOpenUrlFromTabEvent != null && this != null && args != null)
                {
                    OnOpenUrlFromTabEvent(this, args);
                    return args.bok;
                }
                return false;
            }
     
            //----------------------------------------------------
     
            public void OnPluginCrashed(IWebBrowser browserControl, IBrowser browser, string pluginPath)
            {
                //EventHandler<OnPluginCrashedEventArgs> handler = OnPluginCrashedEvent;
                OnPluginCrashedEventArgs args = new OnPluginCrashedEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.pluginPath = pluginPath;
                if (OnPluginCrashedEvent != null && this != null && args != null)
                {
                    OnPluginCrashedEvent(this, args);
                }
            }
     
            //----------------------------------------------------
     
            public bool GetAuthCredentials(IWebBrowser browserControl, IBrowser browser, IFrame frame, bool isProxy, string host, int port, string realm, string scheme, IAuthCallback callback)
            {
                //EventHandler<GetAuthCredentialsEventArgs> handler = GetAuthCredentialsEvent;
                GetAuthCredentialsEventArgs args = new GetAuthCredentialsEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.isProxy = isProxy;
                args.host = host;
                args.port = port;
                args.realm = realm;
                args.scheme = scheme;
                args.callback = callback;
                args.bok = false;
                if (GetAuthCredentialsEvent != null && this != null && args != null)
                {
                    GetAuthCredentialsEvent(this, args);
                    return args.bok;
                }
                return true;
            }
     
            //----------------------------------------------------
     
            public void OnRenderProcessTerminated(IWebBrowser browserControl, IBrowser browser, CefTerminationStatus status)
            {
               //EventHandler<OnRenderProcessTerminatedEventArgs> handler = OnRenderProcessTerminatedEvent;
                OnRenderProcessTerminatedEventArgs args = new OnRenderProcessTerminatedEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.status = status;
                if (OnRenderProcessTerminatedEvent != null && this != null && args != null)
                {
                    OnRenderProcessTerminatedEvent(this, args);
                }
            }
     
            //----------------------------------------------------
     
            public bool OnQuotaRequest(IWebBrowser browserControl, IBrowser browser, string originUrl, long newSize, IRequestCallback callback)
            {
                //EventHandler<OnQuotaRequestEventArgs> handler = OnQuotaRequestEvent;
                OnQuotaRequestEventArgs args = new OnQuotaRequestEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.originUrl = originUrl;
                args.newSize = newSize;
                args.callback = callback;
                args.bok = true;
                if (OnQuotaRequestEvent != null && this != null && args != null)
                {
                    OnQuotaRequestEvent(this, args);
                    return args.bok;
                }
                return true;
            }
     
            //----------------------------------------------------
     
            public bool OnProtocolExecution(IWebBrowser browserControl, IBrowser browser, string url)
            {
                //EventHandler<OnProtocolExecutionEventArgs> handler = OnProtocolExecutionEvent;
                OnProtocolExecutionEventArgs args = new OnProtocolExecutionEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.url = url;
                args.bok = true;
                if (OnProtocolExecutionEvent != null && this != null && args != null)
                {
                    OnProtocolExecutionEvent(this, args);
                    return args.bok;
                }
                return true;
            }
     
            //----------------------------------------------------
     
            public void OnRenderViewReady(IWebBrowser browserControl, IBrowser browser)
            {
                //EventHandler<OnRenderViewReadyEventArgs> handler = OnRenderViewReadyEvent;
                OnRenderViewReadyEventArgs args = new OnRenderViewReadyEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                if (OnRenderViewReadyEvent != null && this != null && args != null)
                {
                    OnRenderViewReadyEvent(this, args);
                }
            }
     
            //----------------------------------------------------
     
            public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength)
            {
                //EventHandler<OnResourceLoadCompleteEventArgs> handler = OnResourceLoadCompleteEvent;
                OnResourceLoadCompleteEventArgs args = new OnResourceLoadCompleteEventArgs();
                args.browserControl = browserControl;
                args.browser = browser;
                args.frame = frame;
                args.request = request;
                args.response = response;
                args.status = status;
                args.receivedContentLength = receivedContentLength;
                if (OnResourceLoadCompleteEvent != null && this != null && args != null)
                {
                    OnResourceLoadCompleteEvent(this, args);
                }
            }
     
            public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response)
            {
                return null;
            }
        }
     
        //--------------------------------------------------------------------
        //Implémentation de l'interface de gestions des téléchargements
     
        public class OnBeforeDownloadEventArgs : EventArgs
        {
            public IBrowser browser { get; set; }
            public DownloadItem downloadItem { get; set; }
            public IBeforeDownloadCallback callback { get; set; }
        }
        public class OnDownloadUpdatedEventArgs : EventArgs
        {
            public IBrowser browser { get; set; }
            public DownloadItem downloadItem { get; set; }
            public IDownloadItemCallback callback { get; set; }
        }
     
        public class DownloadHandler : IDownloadHandler
        {
     
            //public event EventHandler<OnBeforeDownloadEventArgs> OnBeforeDownloadEvent;
            public event EventHandler<OnDownloadUpdatedEventArgs> OnDownloadUpdatedEvent;
     
            public void OnBeforeDownload(IBrowser browser, DownloadItem downloadItem, IBeforeDownloadCallback callback)
            {
                if (!callback.IsDisposed)
                {
                    using (callback)
                    {
                        callback.Continue(downloadItem.SuggestedFileName, showDialog: true);
                    }
                }
            }
     
            //----------------------------------------------------
     
            public void OnDownloadUpdated(IBrowser browser, DownloadItem downloadItem, IDownloadItemCallback callback)
            {
                //EventHandler<OnDownloadUpdatedEventArgs> handler = OnDownloadUpdatedEvent;
                OnDownloadUpdatedEventArgs args = new OnDownloadUpdatedEventArgs();
                args.browser = browser;
                args.downloadItem = downloadItem;
                args.callback = callback;
                if (OnDownloadUpdatedEvent != null && this != null && args != null)
                {
                    OnDownloadUpdatedEvent(this, args);
                }
            }
        }
     
        //--------------------------------------------------------------------
        //Implémentation de l'interface de gestions des fenêtres
     
        //https://github.com/cefsharp/CefSharp/blob/master/CefSharp/ILifeSpanHandler.cs
        //https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Wpf.Example/Handlers/LifespanHandler.cs
     
        public class LifeSpanHandler : ILifeSpanHandler
        {
            bool bOnBeforePopupStartProcess;
     
            //public event Action<string> PopupRequest;
            public bool DoClose(IWebBrowser browserControl, IBrowser browser)
            {
                //throw new NotImplementedException();
                return false;
            }
            public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
            {
                //throw new NotImplementedException();
                return;
            }
     
            public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
            {
                //throw new NotImplementedException();
                return;
            }
     
            public void set_bOnBeforePopupStartProcess(bool _bOnBeforePopupStartProcess)
            {
                this.bOnBeforePopupStartProcess = _bOnBeforePopupStartProcess;
            }
     
            public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
            {
                //Preserve new windows to be opened and load all popup urls in the same browser view
                newBrowser = null;
                if (this.bOnBeforePopupStartProcess)
                {
                    Process.Start(targetUrl);
                }
                else
                {
                    browserControl.Load(targetUrl);
                }
                return true;
            }
        }
     
    }

    Voilà,

    Bonne prog

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