ChromiumFx / Cef Как отправить пользовательское сообщение IPC процессу рендеринга и выполнить собственный код C # - PullRequest
0 голосов
/ 25 мая 2018

Я пытался выяснить, как я могу отправить свое собственное сообщение IPC процессу рендеринга из процесса браузера, чтобы его можно было обработать в потоке пользовательского интерфейса процесса рендеринга.Я хочу выполнить свой собственный код на c # или c ++ в реальном потоке пользовательского интерфейса процесса визуализации.

Согласно тому, что я нашел на некоторых форумах, это должно быть сделано путем реализации интерфейса CefRenderProcessHandler, а затем возврата экземплярамоего созданного класса для функции GetRendererProcessHandler в CefApp.

Что я не могу понять, как успешно выполнить эту задачу, используя ChromiumFx и класс ChromiumWebBrowser.Первая проблема заключается в том, что функция ChromiumWebBrowser.Initialize создает объект CfxApp, поэтому для меня нет подходящего места, чтобы присоединиться к событию GetRendererHandlerProcess и ответить моей реализацией интерфейса CefRenderProcessHandler, на который здесь ссылаются.http://magpcss.org/ceforum/apidocs3/projects/(default)/CefRenderProcessHandler.html

В соответствии с тем, что я прочитал, мне нужно реализовать функцию OnProcessMessageReceived этого интерфейса, чтобы я мог правильно обрабатывать сообщение IPC, когда оно получено процессом Renderer.

В целях исследования я попытался изменить функцию ChromiumWebBrowser.Initialize для принятия объекта CfxApp, который я передаю, чтобы я мог подписаться на GenRenderHandlerProcess и предоставить свой собственный класс, производный от CfxRenderProcessHandler, но мой обработчик событий никогда не попадет в браузерprocess.

Когда это не сработало, я попытался присоединиться к событию OnProcessmessageReceived в классе ChromiumFx RenderProcessHandler.Теперь, когда я отправляю свое сообщение с использованием этого кода, оно достигает моей точки останова в процессе браузера в потоке пула потоков (который, как я полагаю, представляет поток рендерера в реальном процессе рендерера).

CfrProcessMessage myMessage = CfrProcessMessage.Create("HelloWorld-Remote");
            CfrListValue args = myMessage.ArgumentList;
            bool success = args.SetString(0, "Chris"); 
            success = e.Browser.SendProcessMessage(CfxProcessId.Renderer, myMessage);

Это неэто мне не поможет, потому что я хочу выполнить пользовательский код c # в реальном потоке пользовательского интерфейса процессов визуализации.

Я поместил некоторые отладочные операторы в класс CfxProcessMessageCreateRemoteCall класса ChromiumFx в методе RemoteProcedure.Я могу видеть в своих инструкциях отладки, что этот код попадает в сам процесс рендеринга при отправке сообщения, но я не вижу, как реализовать свой собственный код, который будет выполняться.Я не вижу, где когда-либо вызывается функция OnProcessMessageReceived в реальном процессе рендеринга.

Есть ли что-то, что мне не хватает?Или есть где-нибудь пример того, как это можно сделать с помощью ChromiumFx?Вот ссылка на документацию по этой функции.

http://magpcss.org/ceforum/apidocs3/projects/(default)/CefRenderProcessHandler.html#OnProcessMessageReceived(CefRefPtr%3CCefBrowser%3E,CefProcessId,CefRefPtr%3CCefProcessMessage%3E)

Я считаю, что я пытаюсь сделать то, что объясняется на вики-странице cef здесь под заголовком Process Runtime Messages: https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-inter-process-communication-ipc

Спасибо за любую помощь / идеи заранее.

1 Ответ

0 голосов
/ 27 мая 2018

Обратите внимание на раздел «Функция точки входа» документации CEF. https://bitbucket.org/chromiumembedded/cef/wiki/GeneralUsage#markdown-header-entry-point-function

Необходимо убедиться, что вы установили правильный обработчик процесса рендеринга в точке входа процесса рендеринга.

...