Frage

Ich habe herum gesucht und habe nicht festgestellt, wie ich das von C#machen würde.

Ich wollte es schaffen, damit ich Google Chrome sagen konnte Nach vorne, Der Rücken, Öffnen Sie die neue Registerkarte, Tab schließen, Neues Fenster öffnen, und Fenster schließen Aus meiner C# -Anwendung.

Ich habe mit Winamp etwas Ähnliches getan

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

und nur wenige andere. Aber ich weiß nicht, welche Nachricht ich senden soll oder wie man findet, welches Fenster an oder irgendetwas weitergeben soll.

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

EDIT: OK, ich werde abgestimmt, also war ich vielleicht nicht klar genug, oder die Leute gehen davon aus, dass ich nicht versucht habe, dies selbst herauszufinden.

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

Ich habe vor ein paar Jahren gefunden, wie man in Winamp die gleiche Idee macht, und ich habe meinen Code angesehen. Ich habe es geschafft, damit ich einen Song überspringen, zurückgehen, spielen, innehalten und Winamp von meinem C# -Code stoppen können. Ich begann mit dem 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);

Dann verwendete der Code, den ich für diese Konstanten verwendet habe, für die Nachrichten, die 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 das bekommen hwnd (Das Programm zum Senden der Nachricht an) von:

IntPtr hwnd = FindWindow(m_windowName, null);

Dann sende ich eine Nachricht an dieses Programm:

SendMessageA(hwnd, WM_COMMAND, WA_STOP, WA_NOTHING);

Ich gehe davon aus, dass ich dies für Google Chrome etwas sehr ähnliches tun würde. Aber ich weiß nicht, was einige dieser Werte sein sollten, und ich habe versucht, die Antwort zu finden, aber ich konnte nicht, weshalb ich hier gefragt habe. Meine Frage ist also, wie ich die Werte bekomme für:

m_windowname und Wm_Command

und dann die Werte für die verschiedenen Befehle, nach vorne, der Rücken, neue Registerkarte, Tab schließen, neues Fenster, Fenster schließen?

War es hilfreich?

Lösung

Beginnen Sie Ihre Forschung bei http://dev.chromium.org/developers


BEARBEITEN: Das Senden einer Nachricht an ein Fenster ist nur die Hälfte der Arbeit. Das Fenster muss auf diese Nachricht antworten und entsprechend handeln. Wenn dieses Fenster nicht über eine Nachricht kennt oder es überhaupt nicht wichtig ist, haben Sie keine Chance, sie durch Senden von Fenstermeldungen zu steuern.

Sie suchen ein Implementierungsdetail zur Fernbedienung von Winamp. Das Senden von Nachrichten ist nur eine Möglichkeit, dies zu tun, und so entschieden sich die Winamp -Entwickler. Die von Ihnen verwendeten Nachrichten sind benutzerdefinierte Nachrichten, die eine bestimmte Bedeutung haben nur zu Winamp.

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

Andere Tipps

Sie können den Fensternamen leicht mit dem Spion ++ von Visual Studio und dem Drücken von Strg+F und dem Finden von Chrome erhalten. Ich habe es versucht und bekommen

"Chrome_vistaframe" für das Out -Fenster. Das tatsächliche Fenster mit der Webseite in ist "Chrome_RenderWidgethoSthwnd".

Soweit Wm_Command geht - Sie müssen experimentieren. Sie möchten offensichtlich Schaltflächenklicks senden (Wm_MouseDown von oben von meinem Kopf). Als Rückseite sind die Vorwärtsschaltflächen nicht ihre eigenen Fenster. Sie müssen herausfinden, wie Sie dies tun, wenn Sie eine Mausklick auf eine bestimmte X -Position, y -Position machen, damit Chrome weiß, was Sie tun. Oder Sie können das Tastatur -Verknüpfungspunkt für Rück-/Vorwärts- und so weiter senden.

Ein Beispiel, das ich vor einiger Zeit geschrieben habe, macht dies mit Trillian und Winamp: Senden Sie Nachrichten über C# an Windows und WinAPi

Es gibt auch Tools, um diese Art von Dingen bereits mit einer Skriptsprache zu makroieren - autoit ist eine, die ich verwendet habe: Autoit.com

Ok, hier ist was ich so weit habe ... Ich weiß irgendwie, was ich tun muss, aber es geht nur darum, es jetzt zu tun ...

Hier ist das Fenster von Spy ++, ich habe mich an das abgeschlossen Chrome_renderwidgethosthwnd und klickte auf die Schaltfläche zurück auf meiner Tastatur. Hier ist, was ich habe:alt text

Hier sind meine Annahmen, und ich habe jetzt für immer damit gespielt, ich kann das einfach nicht herausfinden Werte.

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

Jetzt weiß ich einfach nicht, was ich die WM_Keydown/UP -Werte oder die VK_Browser_Back/Forward -Werte machen sollte ... Ich habe dies ausprobiert:

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

Die beiden letzteren Werte, die ich von dem Bild erhalten habe, das ich gerade gezeigt habe, die Scancodes für diese beiden Schlüssel. Ich weiß nicht, ob ich es richtig gemacht habe. Die ehemaligen zwei Werte, die ich nach der Suche nach Google nach dem WM_Keydown -Wert erhalten habe, und jemand, der & H100 und & H101 für die beiden Werte verwendet hat. Ich habe mehrere andere zufällige Ideen ausprobiert, die ich gesehen habe. Ich kann das einfach nicht herausfinden.

Oh, und hier ist die SendMessage -Methode

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

Dies ist eine großartige Seite für Interop -Konstanten:

Pinvoke

Eine andere Möglichkeit, die Werte zu finden, besteht darin, Koders.com mit C# als Sprache zu durchsuchen, für wm_keydown oder die Konstante, die Sie nach haben:

Koders.com -Suche

& H -Werte sehen so aus, als wäre das von VB (6). Pinvoke und Koder gibt beide Rückkehrergebnisse 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 lustig, wie viele falsche Definitionen von VK-Konstanten schweben, wenn man bedenkt, dass VK_* 1 Byte 0-255-Werte sind, und die Leute haben sie Uints gemacht).

Sieht etwas anders aus von Ihren Consts. Ich denke, die Funktion, nach der Sie nachgehen, ist SendInput (aber ich habe es nicht ausprobiert), da es sich um einen virtuellen Schlüssel handelt.

[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 eine Reihe von Eingangsstrukturen. Jede Struktur stellt ein Ereignis dar, das in den Tastatur- oder Mauseingangsstrom eingefügt werden soll.
  • CBSIZE - Gibt die Größe in Bytes einer Eingabestruktur an. Wenn CBSIZE nicht die Größe einer Eingabestruktur hat, schlägt die Funktion fehl.

Dies erfordert einen Typ 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; 
}

Und schließlich ein Beispiel, das ich nicht getestet habe, wenn es funktioniert:

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

Außerdem müssen Sie das Chromfenster mithilfe des Fensters konzentrieren SetforecroundWindow

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top