Enviar información desde Chromium Embedded (Javascript) a una aplicación C ++ que contiene

Después de revisar el ejemplo de Chromium Embedded Framework, tengo una pregunta. Necesito interacción nativa con la parte integrada de mi window. Sin embargo, en el ejemplo de CEF, todo lo que vi fue c ++ enviando posts al browser, y no al revés. Me preguntaba si hay alguna forma de enviar un post desde JavaScript desde c ++, como en el caso de una function.

Lo que estoy buscando es algo como esto. Tengo un button en mi página web que cuando hace clic. Me gustaría minimizar la window. ¿Hay alguna manera de llamar a algunos c ++ desde JavaScript en CEF?

La manera más fácil: 1. En el process principal (process de IU), puede crear un controller de esquema personalizado (también puede estar vinculado al protocolo http y a distintos manejadores por dominio). 2. Desde el lado JS, puede usar XMLHttpRequest para llamar a su manejador de esquema. Es un mecanismo estándar para IPC entre JS <> Proceso principal.

De otra manera: utilice enlaces V8, pero en este caso necesitará crear su propio IPC entre el procesador y el process principal. O use el IPC incorporado, pero tenga en count que envía posts solo de manera asíncrona.

Si alguien necesita un ejemplo, aquí hay una forma en que lo hice:

  1. Determine el 'protocolo' personalizado que desea usar aquí hay un ejemplo como una macro cadena #define PROTO_MYAPPCOMMAND "myapp: //"

  2. En su class CefApp personalizada (la que henetworkinga de CefApp), también henetworkinga de CefRenderProcessHandler.

  3. implementar la function OnBeforeNavigation ():

    //declare (ie in header) virtual bool OnBeforeNavigation(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, NavigationType navigation_type, bool is_networkingirect) OVERRIDE; //implementation bool CClientApp::OnBeforeNavigation(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, NavigationType navigation_type, bool is_networkingirect) { CefString cefval = request->GetURL(); CString csval = cefval.c_str(); if (csval.Find(PROTO_MYAPPCOMMAND, 0) == 0) { //process the command here //this is a command and not really intended for navigation return true; } return false; //true cancels navigation, false allows it } 

Aquí hay un ejemplo de cómo agregar un button de la aplicación 'salir':

en cpp

  #define STR_COMMANDAPPEXIT _T("command.appexit") bool CClientApp::OnBeforeNavigation(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefRequest> request, NavigationType navigation_type, bool is_networkingirect) { CefString cefval = request->GetURL(); CString csval = cefval.c_str(); if (csval.Find(PROTO_MYAPPCOMMAND, 0) == 0) { CString command = url; command.Replace(PROTO_MYAPPCOMMAND, _T("")); if (command.Find(STR_COMMANDAPPEXIT, 0) == 0) { ::PostMessage(hwnd, WM_CLOSE, NULL, NULL); } //this is a command and not really intended for navigation return true; } return false; //true cancels navigation, false allows it } 

también creó un file de utilidad js para todas las operaciones para simplificar su llamada

  var MYHOST = MYHOST || {}; /// Exit the Application (host app) MYHOST.ExitApp = function() { window.location = 'myapp://command.appexit'; }; 

en las páginas js (es decir, en un clic de button / div)

  <div class="exitbutton" onclick="MYHOST.ExitApp();">Exit</div> 

Si necesita pasar parameters, solo agréguelos en la url en js y analice la cadena en el cpp, así:

  MYHOST.DoSomething = function() { window.location = 'myapp://command.dosomething?param1=' + value1 + "&param2=" + value2 + "&param3=" + value3; }; 

nota: simplifiqué el código, pero por favor agregue las validaciones, etc.

¡Espero que esto ayude!

¡También hay una manera más simple de hacer esto, necesitando una sola línea de código!

Solo usa…

 Console.Log('. ...'); 

en su código JavaScript con un char ESC líder (o lo que sea que desee) frente a la estructura de cadena / datos que necesita enviar a la aplicación. Simplemente implemente el 'OnConsoleMessage' y active el trabajo preciso de acuerdo con el carácter principal o no ESC del post.

Eso es.

Espero que esto pueda ayudar.