C#-C#アプリケーションからGoogle Chromeにメッセージを送信する
-
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 にロックして、キーボードの[戻る]ボタンをクリックしました。ここに私が得たものがあります:
だから、ここに私の仮定があります。そして、私はこれを永遠に遊んでいますが、値を理解できません。
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で検索することです。
& 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]));
}