1

我正在尝试改造现有的 NPAPI 插件以使用 Google 的本机消息传递技术。由于它是一个现有的 exe,我们已经编写了一些控制台行为,以便用户可以从终端调用我们的程序。我们有什么方法可以在 C# 应用程序中检测到该 exe 已由 Google Chrome 启动以进行消息传递?如果我们能做到这一点,如果我们从 Chrome 调用我们可以启动消息传递循环,但如果从 Powershell/cmd 调用恢复正常行为。

我尝试检查 Chrome 启动时传递给程序的命令行参数,但没有。有一个可配置的选项可以为我们解决这个问题,但据我所知这是不可能的。我还没有机会检查当前的工作目录,以防它也可以用作标识符。

4

3 回答 3

2

事实上,是的,我相信这是可能的。

例如,当 C# 控制台应用程序作为本机消息客户端主机启动时,它会传递两个参数:

--parent-window=<number>

chrome-extension://<extension identifier>/

我认为第二个论点可能是确定不仅是 Chrome 启动了该过程,而且是您编写并打算调用它的特定扩展程序启动它的理想论点!

请注意,“<”和“>”并不是参数的字面部分,只是用来表示该部分消息的开始和结束,就像双引号一样。

Chrome Native Host

或者,只需让您的扩展程序调用一个将特殊参数传递给您的本地主机的脚本(.bat、.sh 等)。这样你就可以传递你自己的特定参数。

于 2013-12-20T15:04:49.380 回答
1

API 不支持传递命令行参数,但您的主机进程应该能够检查其自己的父进程以确定它是由 Chrome 还是其他东西启动的。

于 2013-11-13T21:42:04.493 回答
0

An alternative to checking the arguments as suggested by @aikeru would be to check for the existence of certain environment variables that were passed from Chrome to the native messaging host. My host has the following variables that seem to be specific to Chrome (found with Sysinternals Process Monitor):

CHROME_ALLOCATOR=TCMALLOC
CHROME_BREAKPAD_PIPE_NAME=\\.\pipe\GoogleCrashServices\S-1-5-18
CHROME_MAIN_TIME=13037817851797830
CHROME_METRO_DLL=0
CHROME_PRE_READ_EXPERIMENT=100-pct-default
CHROME_RESTART=Google Chrome|Whoa! Google Chrome has crashed. Relaunch now?|LEFT_TO_RIGHT
CHROME_VERSION=33.0.1750.117
于 2014-03-02T22:36:08.003 回答