C# - отправка сообщений в Google Chrome из приложения C#

Я искал вокруг, и я не нашел, как я бы это сделал с C#.

Я хотел сделать это, чтобы я мог сказать Google Chrome идти вперед, назад, Открыть Новую Вкладку, Закрыть Вкладку, Открыть Новое Окно и Закрыть Окно из моего приложения c#.

Я сделал что-то подобное с WinAmp, используя

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

и некоторые другие. Но я не знаю, что сказать. отправить или как найти, в какое окно его передать, или что-нибудь еще.

так может кто-нибудь показать мне, как я отправлю эти 6 команд в Chrome с C#? спасибо

изменить: Ладно, меня голосуют против, так что, возможно, я недостаточно ясно выразился, или люди предполагают, что я не пытался разобраться в этом сам.

во-первых, я не очень хорошо со всем DllImport вещи. Я все еще учусь, как все это работает.

я нашел, как сделать ту же идею в winamp несколько много лет назад я изучал свой код. Я сделал это, чтобы я мог пропустить песню, вернуться, играть, пауза и остановить winamp от моего кода C#. Я начал с импорта:

    [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

и затем, значения для различных команд,вперед, назад, новая вкладка, закрыть вкладку, новый окно, закрыть окно?

4 ответов


начните исследование на http://dev.chromium.org/developers


редактировать: отправка сообщения в окно - это только половина работы. Окно должно ответить на это сообщение и действовать соответствующим образом. Если это окно не знает о сообщении или не заботится вообще, у вас нет возможности контролировать его, отправляя сообщения окна.

вы смотрите на детали реализации о том, как вы дистанционно управляли Winamp. Отправка сообщений только один способ сделать это, и это то, как разработчики Winamp выбрали. Те сообщения, которые вы используете, являются пользовательскими сообщениями, которые имеют определенное значение только С Winamp.

то, что вы должны сделать в первом шаге, чтобы узнать если Chromium поддерживает какой-то пульт дистанционного управления и что это за механизмы.


вы можете легко получить имя окна, используя Spy++ Visual Studio и нажав CTRL+F, а затем найти chrome. Я попробовал и получил

"Chrome_VistaFrame" за окно. Фактическое окно с веб-страницей в "Chrome_RenderWidgetHostHWND".

Что касается WM_COMMAND - вам нужно будет поэкспериментировать. Вы, очевидно, захотите отправить щелчки кнопки (WM_MOUSEDOWN верхней части моей головы). Поскольку кнопки Назад,Вперед не являются их собственными окнами, вам нужно будет выяснить как это сделать, имитируя щелчок мыши в определенной позиции x, y, чтобы chrome знал, что вы делаете. Или вы можете отправить комбинацию клавиш, эквивалентную back / forward и так далее.

пример, который я написал некоторое время назад, делает это с Триллиан и winamp:отправка сообщений в windows через c# и winapi

есть также инструменты, чтобы макро из такого рода вещей уже, используя язык сценариев-autoit-это тот, который я использовал: autoit.com


хорошо, вот что у меня есть до сих пор... Я вроде как знаю, что мне нужно сделать, но это только вопрос времени...

вот окно из Spy++, я заблокирован на Chrome_RenderWidgetHostHWND и нажал кнопку "Назад"на клавиатуре. Вот что у меня есть.: alt text

Итак, вот мои предположения, и я играл с этим навсегда, я просто не могу понять значения.

IntPtr hWnd = FindWindow("Chrome_RenderWidgetHostHWND", null);
SendMessage(hWnd, WM_KEYDOWN, VK_BROWSER_BACK, 0);
SendMessage(hWnd, WM_KEYUP,   VK_BROWSER_BACK, 0);

Теперь, я просто не знаю, что я должен сделать значения WM_KEYDOWN/UP или значения VK_BROWSER_BACK/FORWARD... Я попробовал:

const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int VK_BROWSER_BACK = 0x6A;
const int VK_BROWSER_FORWARD = 0x69;

последние два значения я получил из изображения, которое я только что показал, Сканкоды для этих двух ключей. Не знаю, правильно ли я это сделал. Первые два значения я получил после поиска в google значения WM_KEYDOWN, а кто-то использовал &H100 и &H101 для двух значений. Я пробовал несколько других случайных идей, которые я видел плавающими вокруг. Я просто не могу этого понять. из.

О, И вот метод SendMessage

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, uint lParam);

Это отличный сайт для констант взаимодействия:

вызов PInvoke

другой способ поиска значений-поиск koders.com, используя C# в качестве языка, для WM_KEYDOWN или константы, которую вы ищете:

Koders.com поиск

&H значения выглядят так, как будто это из VB (6). pinvoke и кодеры возвращают результаты для VK_BROWSER_FORWARD,

private const UInt32 WM_KEYDOWN        = 0x0100;
private const UInt32 WM_KEYUP          = 0x0101;

public const ushort VK_BROWSER_BACK = 0xA6;
public const ushort VK_BROWSER_FORWARD = 0xA7;
public const ushort VK_BROWSER_REFRESH = 0xA8;
public const ushort VK_BROWSER_STOP = 0xA9;
public const ushort VK_BROWSER_SEARCH = 0xAA;
public const ushort VK_BROWSER_FAVORITES = 0xAB;
public const ushort VK_BROWSER_HOME = 0xAC;

(забавно, сколько неправильных определений констант VK плавающие вокруг, учитывая VK_* являются 1 байт 0-255 значений,и люди сделали их uints).

выглядит немного отличается от ваших запоров. Я думаю, что функция, которую вы ищете, - SendInput (но я не пробовал), поскольку это виртуальный ключ.

[DllImport("User32.dll")]
private static extern uint SendInput(uint numberOfInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] KEYBOARD_INPUT[] input, int structSize);

описание параметров:

параметры

  • nInputs-количество структур в массиве pInputs.
  • pInputs-указатель на массив входных структур. Каждый структура представляет событие, которое будет вставлено во входной поток клавиатуры или мыши.
  • cbSize-задает размер входной структуры в байтах. Если cbSize не является размером входной структуры, функция завершается ошибкой.

для этого нужен тип KEYBOARD_INPUT:

[StructLayout(LayoutKind.Sequential)] 
public struct KEYBOARD_INPUT
{ 
    public uint type; 
    public ushort vk; 
    public ushort scanCode; 
    public uint flags; 
    public uint time; 
    public uint extrainfo; 
    public uint padding1; 
    public uint padding2; 
}

и, наконец, образец, который я не тестировал, если он работает:

/*
typedef struct tagKEYBDINPUT {
    WORD wVk;
    WORD wScan;
    DWORD dwFlags;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;
*/
public static void sendKey(int scanCode, bool press)
{
        KEYBOARD_INPUT[] input = new KEYBOARD_INPUT[1];
        input[0] = new KEYBOARD_INPUT();
        input[0].type = INPUT_KEYBOARD;
        input[0].vk = VK_BROWSER_BACK;

    uint result = SendInput(1, input, Marshal.SizeOf(input[0]));
}

Также вам нужно будет сфокусировать окно Chrome, используя SetForegroundWindow