C#-C#アプリケーションからGoogle Chromeにメッセージを送信する

StackOverflow https://stackoverflow.com/questions/147929

  •  02-07-2019
  •  | 
  •  

質問

探し回っていますが、C#からこれをどのように行うかわかりません。

Google Chromeに進む戻る新しいタブを開く閉じるように指示できるようにしたかったタブ新しいウィンドウを開く、C#アプリケーションのウィンドウを閉じる

WinAmpを使用して同様のことを行いました

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

その他いくつか。しかし、どのメッセージを送信するか、どのウィンドウにメッセージを渡すかを見つける方法などはわかりません。

では、C#からChromeにこれらの6つのコマンドを送信する方法を教えてくれませんか?ありがとう

編集: OK

最初に、DllImportのすべてのことをあまり得意ではありません。まだどのように機能するかを学んでいます。

数年前にwinampで同じアイデアを実現する方法を見つけて、コードを見ていました。曲をスキップし、戻って、再生し、一時停止し、C#コードからwinampを停止できるようにしました。インポートすることから始めました:

    [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

次に、さまざまなコマンドの値、 forward back 新しいタブタブを閉じる新しいウィンドウウィンドウを閉じる

役に立ちましたか?

解決

http://dev.chromium.org/developers

から調査を開始します

編集:メッセージをウィンドウに送信することは作業の半分にすぎません。ウィンドウはそのメッセージに応答し、それに応じて行動する必要があります。そのウィンドウがメッセージを知らないか、まったく気にしない場合、ウィンドウメッセージを送信して制御する機会はありません。

Winampをリモート制御する方法に関する実装の詳細を見ています。メッセージを送信することは、そのための1つの方法に過ぎず、Winamp開発者が選択した方法です。使用しているこれらのメッセージは、Winampに対して特定の意味を持つのみのユーザー定義メッセージです。

最初のステップで行う必要があるのは、Chromiumが何らかのリモート制御をサポートしている場合の if と、それらのメカニズムについてです。

他のヒント

Visual StudioのSpy ++を使用し、CTRL + Fを押してクロムを見つけると、ウィンドウ名を簡単に取得できます。試してみた

" Chrome_VistaFrame"外の窓のため。 Webページが表示される実際のウィンドウは" Chrome_RenderWidgetHostHWND"です。

WM_COMMANDに関する限り-実験する必要があります。ボタンのクリック(頭の上のWM_MOUSEDOWN)を送信することは明らかです。戻る、進むボタンは独自のウィンドウではないので、特定のX、Y位置でマウスクリックをシミュレートしてこれを行う方法を理解する必要があります。そうすれば、Chromeはあなたが何をしているかを知ることができます。または、戻る/進むなどに相当するキーボードショートカットを送信することもできます。

私が少し前に書いた例は、Trillianとwinampでこれを行います:メッセージの送信c#およびwinapiを介してWindowsに

スクリプト言語を使用して、この種のものをマクロ化するツールも既にあります-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;

先ほど示した画像から取得した後者の2つの値、これら2つのキーのスキャンコード。私はそれをやったかどうかはわかりません。前の2つの値は、GoogleでWM_KEYDOWN値を検索した後に取得したもので、誰かが& H100と& H101を2つの値に使用しました。私は、浮かんでいる他のいくつかのランダムなアイデアを試しました。私はこれを理解できません。

ああ、これがSendMessageメソッドです

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

これは、相互運用定数に最適なサイトです。

ピンボーク

値を見つける別の方法は、言語としてC#を使用して、WM_KEYDOWNまたは目的の定数をkoders.comで検索することです。

Koders.com検索

& Hの値は、VB(6)のように見えます。 pinvokeとkodersはどちらも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_ *が1バイトの0-255の値であり、人々がそれらをuintにしたことを考えると、VK定数の間違った定義が浮かんでいるのは面白いことです。)

constとは少し異なります。あなたが求めている機能は仮想キーなので、SendInputだと思います(しかし、私は試していません)。

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

パラメーターについての説明:

パラメータ

  • nInputs- pInputs配列内の構造の数。
  • pInputs-INPUT構造体の配列へのポインター。各構造は、キーボードまたはマウスの入力ストリームに挿入されるイベントを表します。
  • cbSize-INPUT構造のサイズをバイト単位で指定します。 cbSizeがINPUT構造のサイズでない場合、関数は失敗します。

これには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]));
}

また、 SetForegroundWindow

scroll top