我正在尝试改造现有的NPAPI插件,以使用Google的native message passing技术。由于它是一个现有的exe,我们已经编写了一些控制台行为,以便用户可以从终端调用我们的程序。在C#应用程序中,我们有什么方法可以检测到Google Chrome已经启动了用于邮件传递的exe吗?如果我们可以这样做,我们可以启动消息传递循环,如果我们从Chrome调用,但如果从Powershell / cmd调用则恢复正常行为。
我已经尝试检查Chrome启动时传递给程序的命令行参数,但没有。有一个可配置的选项,我们可以解决这个问题,但据我所知,这是不可能的。我还没有机会检查当前的工作目录,以防它也可以用作标识符。
答案 0 :(得分:2)
实际上,是的,我相信这是可能的。
例如,当C#控制台应用程序作为本机消息客户端主机启动时,会传递两个参数:
--parent-window=<number>
和
chrome-extension://<extension identifier>/
我认为第二个论点可能是确定Chrome不仅启动了该流程的理想选择,而且您创作并打算称之为的特定扩展程序已启动它!
请在上面注明“&lt;”和“&gt;”并不是字面上的参数的一部分,只是用来表示消息部分的开头和结尾,就像双引号一样。
或者,只需让您的扩展程序调用将特殊参数传递给本机主机的脚本(.bat,.sh等)。这样你就可以传递你自己的特定参数。
答案 1 :(得分:0)
API不支持传递命令行参数,但您的主机进程应该能够检查自己的父进程,以确定它是由Chrome还是其他人启动的。
答案 2 :(得分:0)
检查@aikeru建议的参数的另一种方法是检查是否存在从Chrome传递到本机消息传递主机的某些环境变量。我的主机有以下似乎特定于Chrome的变量(在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