Я пытался выяснить, как я могу отправить свое собственное сообщение 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
Спасибо за любую помощь / идеи заранее.