Pergunta

Eu tenho procurado e não descobri como faria isso com C#.

Eu estava querendo fazer isso para que eu pudesse dizer ao Google Chrome para ir Avançar, De volta, Abra a nova guia, Aba fechada, Abra a nova janela, e Janela fechada Do meu aplicativo C#.

Eu fiz algo semelhante com Winamp usando

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

e poucos outros. Mas não sei qual mensagem enviar ou como encontrar a qual janela passá -la ou qualquer coisa.

Então, alguém poderia me mostrar como eu enviaria esses 6 comandos para o Chrome a partir de C#? obrigado

EDIT: OK, estou sendo eliminado, então talvez não estivesse claro o suficiente, ou as pessoas estão assumindo que não tentei descobrir isso por conta própria.

Primeiro, não sou muito bom com todo o material dllimport. Ainda estou aprendendo como tudo funciona.

Encontrei como fazer a mesma idéia em Winamp há alguns anos e estava olhando para o meu código. Eu fiz isso para pular uma música, voltar, brincar, fazer uma pausa e parar o Winamp do meu código C#. Comecei importando:

    [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);

Em seguida, o código que encontrei para usar isso usava essas constantes para as mensagens que envio.

    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;

Eu faria o hwnd (o programa para enviar a mensagem para) por:

IntPtr hwnd = FindWindow(m_windowName, null);

Então eu enviaria uma mensagem para esse programa:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING);

Suponho que eu faria algo muito semelhante a isso para o Google Chrome. Mas não sei o que alguns desses valores deveriam ser e pesquisei no Google tentando encontrar a resposta, mas não consegui, e é por isso que perguntei aqui. Então, minha pergunta é como obtenho os valores para:

m_windowname e WM_COMMAND

E então, os valores para os diferentes comandos, frente, de volta, Nova aba, aba fechada, nova janela, janela fechada?

Foi útil?

Solução

Comece sua pesquisa em http://dev.chromium.org/developers


EDITAR: Enviar uma mensagem para uma janela é apenas metade do trabalho. A janela precisa responder a essa mensagem e agir de acordo. Se essa janela não souber sobre uma mensagem ou não se importa, você não tem chance de controlá -la enviando mensagens de janela.

Você está olhando para um detalhe de implementação sobre como o Winamp controlado remoto. Enviar mensagens é apenas uma maneira de fazê -lo e é assim que os desenvolvedores do Winamp escolherem. Essas mensagens que você está usando são mensagens definidas pelo usuário que têm um significado específico para Winamp.

O que você precisa fazer no primeiro passo é descobrir E se O cromo suporta algum tipo de controle remoto e quais são esses mecanismos.

Outras dicas

Você pode obter o nome da janela facilmente usando o SPY ++ do Visual Studio e pressionando Ctrl+F, depois encontrando o Chrome. Eu tentei e consegui

"Chrome_vistaframe" para a janela fora. A janela real com a página da web é "Chrome_renderwidgethosthwnd".

No que diz respeito a WM_Command - você precisará experimentar. Obviamente, você desejará enviar cliques de botão (WM_MOUSEDOWN da parte superior da minha cabeça). Como os botões para trás, os botões de encaminhamento não são suas próprias janelas, você precisará descobrir como fazer isso para simular um clique do mouse em uma determinada posição X, Y para que o Chrome saiba o que você está fazendo. Ou você pode enviar o atalho do teclado equivalente para Back/Forward e assim por diante.

Um exemplo que escrevi há algum tempo faz isso com Trillian e Winamp: Enviando mensagens para o Windows via C# e Winapi

Também existem ferramentas por aí para macro fora desse tipo de coisa, usando uma linguagem de script - o Autoit é um que eu usei: autoit.com

Ok, aqui está o que eu tenho até agora ... eu meio que sei o que preciso fazer, mas é apenas uma questão de fazer isso agora ...

Aqui está a janela do spy ++, eu traquei no Chrome_renderwidgethosthwnd e clicou no botão Voltar no meu teclado. Aqui está o que eu tenho:alt text

Então, aqui estão minhas suposições, e eu tenho brincado com isso sempre agora, simplesmente não consigo descobrir o valores.

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

Agora, eu simplesmente não sei o que devo fazer com que os valores wm_keydown/up ou os valores vk_browser_back/avanço ... tentei o seguinte:

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

Os dois últimos valores que recebi da imagem que acabei de mostrar, os Scancodes para essas duas teclas. Eu não sei se fiz certo. Os dois primeiros valores que recebi depois de pesquisar no Google pelo valor WM_KEYDOWN e alguém usou & H100 e & H101 para os dois valores. Eu tentei várias outras idéias aleatórias que vi flutuando. Eu simplesmente não consigo descobrir isso.

Ah, e aqui está o método de sendmessage

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

Este é um ótimo site para constantes de interoperamento:

Pinvoke

Outra maneira de encontrar os valores é pesquisar no koders.com, usando C# como idioma, para wm_keydown ou a constante que você procura:

Pesquisa Koders.com

Os valores de & h parecem que é de VB (6). Pinvoke e Koders retornam os resultados para 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;

(É engraçado quantas definições erradas das constantes de VK estão flutuando, considerando que o VK_* são 1 byte 0-255, e as pessoas os tornaram uints).

Parece um pouco diferente dos seus constantes. Eu acho que a função que você procura é sendinput (mas eu não experimentei), pois é uma chave virtual.

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

Explicação sobre os parâmetros:

Parâmetros

  • Ninputs- número de estruturas na matriz Pinputs.
  • Pinputs - Ponteiro para uma matriz de estruturas de entrada. Cada estrutura representa um evento a ser inserido no teclado ou no fluxo de entrada do mouse.
  • CBSize - Especifica o tamanho, em bytes, de uma estrutura de entrada. Se o CBSize não for o tamanho de uma estrutura de entrada, a função falhará.

Isso precisa de um tipo de 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; 
}

E, finalmente, uma amostra, que não testei se funciona:

/*
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]));
}

Além disso, você precisará concentrar a janela do Chrome usando SetforegroundWindow

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top