2008-09-29 18 views
19

Ho cercato in giro, e non ho trovato come avrei fatto questo da C#.C# - Invio di messaggi a Google Chrome dall'applicazione C#

Mi mancava di fare in modo ho potuto dire a Google Chrome di andare Forward, Indietro, aperta una nuova scheda, Chiudi scheda, Apri nuova finestra, e Chiudi finestra dal mio Applicazione C#.

ho fatto qualcosa di simile con WinAmp utilizzando

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

e pochi altri. Ma non so quale messaggio mandare o come trovare la finestra per passarlo o altro.

Quindi qualcuno potrebbe mostrarmi come inviare questi 6 comandi a Chrome da C#? grazie

MODIFICA: Ok, mi sto facendo votare, quindi forse non ero abbastanza chiaro, o le persone pensano che non ho provato a capirlo da solo.

Prima di tutto, non sono molto bravo con l'intera roba di DllImport. Sto ancora imparando come funziona.

Ho scoperto come fare la stessa idea in Winamp qualche anno fa e stavo guardando il mio codice. L'ho fatto in modo da poter saltare una canzone, tornare indietro, suonare, mettere in pausa e fermare winamp dal mio codice C#. Ho iniziato 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); 

Quindi il codice che ho trovato utilizzava queste costanti per i messaggi che invio.

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; 

Vorrei ottenere il hwnd (il programma per inviare il messaggio a) da:

IntPtr hwnd = FindWindow(m_windowName, null); 

quindi vorrei inviare un messaggio a quel programma:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING); 

I Supponiamo che farei qualcosa di molto simile a questo per Google Chrome. ma non so quali dovrebbero essere alcuni di quei valori, e ho cercato su Google di trovare la risposta, ma non potevo, ed è per questo che ho chiesto qui. Quindi la mia domanda è come ottengo i valori per:

m_windowName e WM_COMMAND

e poi, i valori per i diversi comandi, avanti, indietro, nuova scheda, chiudi scheda, nuova finestra, chiudi finestra?

risposta

9

iniziare la vostra ricerca a http://dev.chromium.org/developers


EDIT: L'invio di un messaggio a una finestra è solo metà del lavoro. La finestra deve rispondere a quel messaggio e agire di conseguenza. Se quella finestra non è a conoscenza di un messaggio o se non ti interessa affatto, non hai alcuna possibilità di controllarlo inviando messaggi alla finestra.

Stai guardando un dettaglio di implementazione su come hai controllato a distanza Winamp. L'invio di messaggi è solo un modo per farlo ed è il modo in cui gli sviluppatori di Winamp hanno scelto. I messaggi che stai utilizzando sono messaggi definiti dall'utente che hanno un significato specifico solo in Winamp.

Quello che devi fare nel primo passaggio è scoprire se Chromium supporta alcuni tipi di controllo remoto e quali sono questi meccanismi.

+0

Sto guardando attraverso e non vedo nulla che possa aiutarmi a realizzare ciò che sto cercando di fare. Non voglio ricompilare Chrome o altro. Voglio solo essere in grado di inviare a Chrome un piccolo messaggio che dice "torna indietro" o qualsiasi altra cosa. Non voglio affatto cambiare Chrome. Fai tutto da C# – Joel

7

È possibile ottenere facilmente il nome della finestra utilizzando Spy ++ di Visual Studio e premendo CTRL + F, quindi trovare chrome. Ho provato e ottenuto

"Chrome_VistaFrame" per la finestra. La finestra effettiva con la pagina web in è "Chrome_RenderWidgetHostHWND".

Per quanto riguarda WM_COMMAND, è necessario sperimentare. Ovviamente vorrete mandare clic sui pulsanti (WM_MOUSEDOWN del top fuori dalla mia testa). Dato che i pulsanti indietro e avanti non sono finestre proprie, dovrai capire come farlo simulando un clic del mouse su una determinata posizione x, y in modo che Chrome sappia cosa stai facendo. Oppure puoi inviare l'equivalente della scorciatoia da tastiera per indietro/avanti e così via.

Un esempio che ho scritto qualche tempo fa fa con Trillian e winamp: sending messages to windows via c# and winapi

C'è anche strumenti là fuori per macro out questo genere di cose già, utilizzando un linguaggio di scripting - AutoIt è uno che ho usato: autoit.com

+0

Quindi ci ho giocato per un'ora o due. Voglio inviare le scorciatoie da tastiera. In questo momento sto cercando di capire come inviare a Chrome il messaggio per WM_KEYDOWN e WM_KEYUP per la chiave VK_BROWSER_BACK. Ma non riesco a capire i valori int per loro. – Joel

4

Ok, ecco quello che ho finora ... I kinda so cosa devo fare, ma è solo una questione di farlo ora ...

Ecco la finestra da Spy ++, ho bloccato su Chrome_RenderWidgetHostHWND e fatto clic sul pulsante Indietro sulla mia tastiera. Ecco quello che ho ottenuto: alt text

Quindi, ecco la mia ipotesi, e ho giocato con questo per sempre ora, non riesco proprio a capire i valori .

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

Ora, io non so cosa devo fare le WM_KEYDOWN/UP valori o valori VK_BROWSER_BACK/FORWARD ... ho provato questo:

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

Gli ultimi due valori di I ottenuto dall'immagine che ho appena mostrato, i ScanCodes per quei due tasti. Non so se l'ho fatto bene però. I primi due valori che ho ottenuto dopo aver cercato su google il valore WM_KEYDOWN, e qualcuno ha usato & H100 e & H101 per i due valori. Ho provato diverse altre idee casuali che ho visto fluttuare in giro. Non riesco a capirlo.

Oh, ed ecco il metodo SendMessage

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

Questo è un ottimo sito per le costanti di interoperabilità:

pinvoke

Un altro modo di trovare dei valori è quello di cercare koders.com, utilizzando C# come lingua, per WM_KEYDOWN o la costante che stai cercando:

Koders.com search

& I valori H sono simili a quelli di VB (6). PInvoke e Koders sia restituiscono risultati per 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; 

(E 'strano come molti defintions sbagliate di costanti VK galleggiano circa, considerando VK_ * sono 1 byte 0-255 valori, e la gente li uints hanno fatto).

Sembra leggermente diverso dalla tua. Penso che la funzione che stai cercando sia SendInput (ma non l'ho ancora provata) in quanto è una chiave virtuale.

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

Spiegazione sui parametri:

Parametri

  • nInputs- Numero di strutture nella matrice pInputs.
  • pInput: puntatore a una matrice di strutture INPUT. Ogni struttura rappresenta un evento da inserire nella tastiera o nel flusso di input del mouse.
  • cbSize - Specifica la dimensione, in byte, di una struttura INPUT. Se cbSize non è la dimensione di una struttura INPUT, la funzione non riesce.

questo ha bisogno di un tipo di 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 infine un campione, che non ho ancora testato se funziona:

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

Inoltre è necessario concentrarsi Chrome window using SetForegroundWindow