2008-09-29 9 views
19

Ich habe gesucht, und ich habe nicht gefunden, wie ich das von C# machen würde.C# - Senden von Nachrichten an Google Chrome von C# -Anwendung

Ich wollte es machen, so konnte ich Google Chrome sagen gehen nach vorne, Zurück, Neue Registerkarte öffnen, Tab schließen, Neues Fenster öffnen und Fenster schließen von meinem C# -Anwendung.

habe ich etwas ähnliches mit WinAmp

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

und ein paar andere. Aber ich weiß nicht, welche Nachricht ich senden soll oder wie ich finde, an welches Fenster ich sie weiterleiten kann.

Also könnte mir jemand zeigen, wie ich diese 6 Befehle von C# an Chrome senden würde? Danke

BEARBEITEN: Ok, ich werde abgewählt, also vielleicht war ich nicht klar genug, oder Leute nehmen an, dass ich nicht versucht habe, dieses heraus allein herauszufinden.

Zunächst einmal, ich bin nicht sehr gut mit dem ganzen DllImport-Zeug. Ich lerne immer noch, wie alles funktioniert.

Ich fand vor ein paar Jahren die gleiche Idee in Winamp, und ich sah mir meinen Code an. Ich habe es so gemacht, dass ich ein Lied überspringen, zurückgehen, spielen, pausieren und Winamp mit meinem C# -Code beenden konnte. Ich begann durch den Import:

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

der Code Dann fand ich diese diese Konstanten für die Nachrichten verwendet verwenden, ich sende.

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; 

Ich würde erhalten die Hwnd durch (das Programm, um die Nachricht zu senden):

IntPtr hwnd = FindWindow(m_windowName, null); 

dann würde ich eine Nachricht an das Programm senden:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING); 

I gehe davon aus, dass ich etwas Ähnliches für Google Chrome tun würde. aber ich weiß nicht, was einige dieser Werte sein sollten, und ich googelte herum und versuchte, die Antwort zu finden, aber ich konnte nicht, weshalb ich sie hier fragte. Also meine Frage ist, wie bekomme ich die Werte für:

m_windowName und WM_COMMAND

und dann werden die Werte für die verschiedenen Befehle, vorwärts, zurück, neuen Tab, close tab, neues Fenster, Fenster schließen?

Antwort

9

Ihre Forschung auf http://dev.chromium.org/developers


EDIT starten: eine Nachricht an ein Fenster senden nur die Hälfte der Arbeit ist. Das Fenster muss auf diese Nachricht reagieren und entsprechend handeln. Wenn dieses Fenster nichts über eine Nachricht weiß oder überhaupt nicht interessiert, haben Sie keine Möglichkeit, es zu kontrollieren, indem Sie Fensternachrichten senden.

Sie schauen sich ein Implementierungsdetail an, wie Sie Winamp ferngesteuert haben. Senden von Nachrichten ist nur eine Möglichkeit, dies zu tun, und es ist die Art und Weise, die die Winamp-Entwickler gewählt haben. Diese Nachrichten, die Sie verwenden, sind benutzerdefinierte Nachrichten, die eine spezifische Bedeutung nur Winamp haben.

Was Sie im ersten Schritt tun müssen, ist herauszufinden, , wenn Chrom unterstützt eine Art Fernbedienung und was diese Mechanismen sind.

+0

Ich sehe durch, und ich sehe nichts, das mir helfen wird zu erreichen, was ich versuche zu tun. Ich möchte Chrome nicht neu kompilieren. Ich möchte Chrome einfach eine kleine Nachricht schicken, in der es heißt "Geh zurück" oder was auch immer. Ich möchte Chrome überhaupt nicht ändern. Tun Sie alles von C# – Joel

7

Sie können den Fensternamen leicht mit Visual Studio Spy ++ und drücken Sie STRG + F, dann finden Sie Chrome. Ich habe es versucht und bekam

"Chrome_VistaFrame" für das Fenster aus. Das eigentliche Fenster mit der Webseite ist "Chrome_RenderWidgetHostHWND".

Soweit WM_COMMAND geht - müssen Sie experimentieren. Sie möchten offensichtlich Knopfklicks (WM_MOUSEDOWN von der Spitze von meinem Kopf) senden. Da die Rückwärtstasten nicht ihre eigenen Fenster sind, müssen Sie herausfinden, wie Sie dies tun, indem Sie einen Mausklick an einer bestimmten x, y-Position simulieren, damit Chrome weiß, was Sie tun. Oder Sie könnten die Tastenkombination für Rückwärts/Vorwärts und so weiter senden.

Ein Beispiel, das ich vor einer Weile geschrieben tut dies mit trillian und winamp: sending messages to windows via c# and winapi

Es gibt auch da draußen Tools Makro bereits diese Art der Sache heraus, eine Skriptsprache - autoit ist, die ich verwendet habe: autoit.com

+0

Also ich habe damit für eine Stunde oder zwei gespielt. Ich möchte die Tastaturkürzel senden. Im Moment versuche ich herauszufinden, wie Chrome die Nachricht für die Schlüssel WM_KEYDOWN und WM_KEYUP für den Schlüssel VK_BROWSER_BACK senden soll. Aber ich kann die int-Werte für sie nicht herausfinden. – Joel

4

Ok, hier ist was ich bisher bekommen habe ... ich weiß irgendwie, was ich tun muss, aber es ist nur eine Frage der es jetzt gerade ...

hier ist das Fenster von Spy ++, ich gesperrt auf die Chrome_RenderWidgetHostHWND und klickte auf die Schaltfläche Zurück auf meiner Tastatur. Hier ist, was ich habe: alt text

Also hier meine Annahmen, und ich habe mit diesem für immer jetzt gespielt, ich kann einfach nicht herausfinden, die Werte.

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

Nun, ich weiß nicht, was ich sollte die WM_KEYDOWN/UP-Werte oder die VK_BROWSER_BACK/FORWARD Werte machen ... habe ich versucht, dies:

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

Die letzteren beiden Werte I Ich habe von dem Bild, das ich gerade gezeigt habe, die ScanCodes für diese beiden Tasten bekommen. Ich weiß nicht, ob ich es richtig gemacht habe. Die ersten beiden Werte, die ich nach der Suche nach dem WM_KEYDOWN-Wert erhalten habe, und jemand hat & H100 und & H101 für die beiden Werte verwendet. Ich habe einige andere zufällige Ideen ausprobiert, die ich gesehen habe. Ich kann das einfach nicht herausfinden.

Oh, und hier ist die Methode Sendmessage

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

Dies ist ein großer Ort für Interop-Konstanten:

pinvoke

Eine andere Möglichkeit, die Werte zu finden, ist koders.com zu suchen, mit C# als Sprache, für WM_KEYDOWN oder die Konstante, nach der Sie suchen:

Koders.com search

& H-Werte sehen aus wie in VB (6). pinvoke und Koders beide Rück Ergebnisse für 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; 

(Es ist schon komisch, wie viele falsche defintions von VK Konstanten schweben über, wenn man bedenkt VK_ * sind 1 Byte 0-255 Werte, und die Menschen haben sie uints gemacht).

Sieht etwas anders aus als Ihre Würmer. Ich denke, die Funktion, die Sie suchen, ist SendInput (aber ich habe es nicht versucht), da es ein virtueller Schlüssel ist.

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

Erläuterung zu den Parametern:

Parameter

  • nInputs- Anzahl der Strukturen im pInputs Array.
  • pInputs - Zeiger auf ein Array von INPUT-Strukturen. Jede Struktur repräsentiert ein Ereignis, das in den Tastatur- oder Mauseingabestrom eingefügt wird.
  • cbSize - Gibt die Größe einer INPUT-Struktur in Byte an. Wenn cbSize nicht die Größe einer INPUT-Struktur hat, schlägt die Funktion fehl.

Dieses eine keyboard input Typ muss: Sie werden die Chrome konzentrieren müssen

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

auch:

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

Und schließlich eine Probe, die ich nicht getestet, ob es funktioniert Fenster mit SetForegroundWindow