C# - 从C#应用程序向Google Chrome发送消息

Joe*_*oel 19 c# message google-chrome

我一直在寻找,我还没有找到我将如何从C#中做到这一点.

我想要这样做,所以我可以告诉谷歌Chrome 从我的C#应用​​程序前进,后退,打开新标签,关闭标签,打开新窗口关闭窗口.

我使用WinAmp做了类似的事情

[DllImport("user32", EntryPoint = "SendMessageA")]
private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);
Run Code Online (Sandbox Code Playgroud)

还有一些其他人.但我不知道要发送什么消息或者如何找到传递给它的窗口,或者其他什么.

那么有人可以告诉我如何从C#向Chrome发送这6个命令吗?谢谢

编辑:好的,我正在投票,所以也许我不够清楚,或者人们假设我没有试图自己解决这个问题.

首先,我对整个DllImport的东西不太满意.我还在学习它是如何运作的.

几年前我在winamp找到了如何做同样的想法,我正在查看我的代码.我做了所以我可以跳过一首歌,回去,播放,暂停,并停止从我的C#代码winamp.我开始导入:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow([MarshalAs(UnmanagedType.LPTStr)] string lpClassName, [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessageA(IntPtr hwnd, int wMsg, int wParam, uint lParam);
    [DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
    public static extern int GetWindowText(IntPtr hwnd, string lpString, int cch);
    [DllImport("user32", EntryPoint = "FindWindowExA")]
    private static extern int FindWindowEx(int hWnd1, int hWnd2, string lpsz1, string lpsz2);
    [DllImport("user32", EntryPoint = "SendMessageA")]
    private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);
Run Code Online (Sandbox Code Playgroud)

然后我发现使用它的代码使用这些常量来发送我发送的消息.

    const int WM_COMMAND = 0x111;
    const int WA_NOTHING = 0;
    const int WA_PREVTRACK = 40044;
    const int WA_PLAY = 40045;
    const int WA_PAUSE = 40046;
    const int WA_STOP = 40047;
    const int WA_NEXTTRACK = 40048;
    const int WA_VOLUMEUP = 40058;
    const int WA_VOLUMEDOWN = 40059;
    const int WINAMP_FFWD5S = 40060;
    const int WINAMP_REW5S = 40061;
Run Code Online (Sandbox Code Playgroud)

我会通过以下方式获得hwnd(发送消息的程序):

IntPtr hwnd = FindWindow(m_windowName, null);
Run Code Online (Sandbox Code Playgroud)

然后我会向该程序发送一条消息:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING);
Run Code Online (Sandbox Code Playgroud)

我认为我会为Google Chrome做一些非常类似的事情.但是我不知道这些价值观应该是什么,我在谷歌上试图找到答案,但我不能,这就是我在这里问的原因.所以我的问题是如何获取以下值:

m_windowNameWM_COMMAND

然后,不同命令的值,前进,后退,新选项卡,关闭选项卡,新窗口,关闭窗口

VVS*_*VVS 9

http://dev.chromium.org/developers开始您的研究


编辑:向窗口发送消息只是工作的一半.窗口必须响应该消息并相应地采取行动.如果该窗口不知道消息或根本不关心,则您无法通过发送窗口消息来控制它.

您正在查看有关如何远程控制Winamp的实现细节.发送消息只是实现它的一种方式,而这正是Winamp开发人员选择的方式.您正在使用的那些消息是用户定义的消息,仅对 Winamp 具有特定含义.

你在第一步要做的是找出是否铬支持某种远程控制的以及这些机制.


Chr*_*s S 7

您可以使用Visual Studio的Spy ++轻松获取窗口名称,然后按CTRL + F,然后找到chrome.我试过了,得到了

用于out窗口的"Chrome_VistaFrame".带有网页的实际窗口是"Chrome_RenderWidgetHostHWND".

就WM_COMMAND而言 - 你需要进行实验.你显然想要发送按钮点击(我头顶的WM_MOUSEDOWN).由于后退,前进按钮不是他们自己的窗口,你需要弄清楚如何通过在某个x,y位置模拟鼠标点击来实现这一点,以便Chrome知道你正在做什么.或者您可以发送等效于后退/前进的键盘快捷键等.

我刚才写的一个例子是trillian和winamp:通过c#和winapi向windows发送消息

还有一些工具可以使用脚本语言来解决这种问题 - autoit是我使用过的:autoit.com