我一直在寻找,我还没有找到我将如何从C#中做到这一点.
我想要这样做,所以我可以告诉谷歌Chrome 从我的C#应用程序前进,后退,打开新标签,关闭标签,打开新窗口和关闭窗口.
我使用WinAmp做了类似的事情
[DllImport("user32", EntryPoint = "SendMessageA")] private static extern int SendMessage(int Hwnd, int wMsg, int wParam, int lParam);
还有一些其他人.但我不知道要发送什么消息或者如何找到传递给它的窗口,或者其他什么.
那么有人可以告诉我如何从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);
然后我发现使用它的代码使用这些常量来发送我发送的消息.
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;
我会通过以下方式获得hwnd(发送消息的程序):
IntPtr hwnd = FindWindow(m_windowName, null);
然后我会向该程序发送一条消息:
SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING);
我认为我会为Google Chrome做一些非常类似的事情.但是我不知道这些价值观应该是什么,我在谷歌上试图找到答案,但我不能,这就是我在这里问的原因.所以我的问题是如何获取以下值:
m_windowName和WM_COMMAND
然后,不同命令的值,前进,后退,新选项卡,关闭选项卡,新窗口,关闭窗口?
从http://dev.chromium.org/developers开始您的研究
编辑:向窗口发送消息只是工作的一半.窗口必须响应该消息并相应地采取行动.如果该窗口不知道消息或根本不关心,则您无法通过发送窗口消息来控制它.
您正在查看有关如何远程控制Winamp的实现细节.发送消息只是实现它的一种方式,而这正是Winamp开发人员选择的方式.您正在使用的那些消息是用户定义的消息,仅对 Winamp 具有特定含义.
你在第一步要做的是找出是否铬支持某种远程控制的以及这些机制.
您可以使用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