19

私は探し回っていますが、C# からこれを行う方法が見つかりませんでした。

Google Chrome に、C# アプリケーションからForwardBackOpen New TabClose TabOpen New Window、およびClose Windowに移動するように指示できるようにしたかったのです。

私はWinAmpで似たようなことをしました

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

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

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

編集:わかりました、私は投票されていないので、おそらく私は十分に明確ではなかったか、人々は私が自分でこれを理解しようとしなかったと思っています.

まず第一に、私は 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_windowNameWM_COMMAND

次に、さまざまなコマンドの値forwardbacknew tabclose tabnew windowclose window ?

4

4 に答える 4

10

http://dev.chromium.org/developersで調査を開始してください


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

Winamp をリモート コントロールする方法の実装の詳細を見ています。メッセージの送信は、それを行うための 1 つの方法にすぎず、Winamp 開発者が選択した方法です。使用しているメッセージは、 Winampだけに特定の意味を持つユーザー定義のメッセージです。

最初のステップで行う必要があるのは、Chromium がある種のリモート コントロールをサポートしているかどうか、およびそれらのメカニズムが何であるかを調べることです。

于 2008-09-29T08:33:26.303 に答える
7

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

アウトウィンドウの「Chrome_VistaFrame」。Webページが表示される実際のウィンドウは「Chrome_RenderWidgetHostHWND」です。

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

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

スクリプト言語を使用して、この種のものをマクロ化するためのツールもあります-autoitは私が使用したものです:autoit.com

于 2008-09-29T09:08:02.367 に答える
4

わかりました、これが私がこれまでに得たものです...何をする必要があるかはちょっと知っていますが、それは今それをするだけの問題です...

これは 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 つのキーの ScanCode です。私がそれを正しくやったかどうかはわかりません。前の 2 つの値は、Google で WM_KEYDOWN 値を検索した後に取得したもので、2 つの値に &H100 と &H101 を使用した人がいます。浮かんでいるのを見た他のいくつかのランダムなアイデアを試しました。私はこれを理解することはできません。

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

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, uint lParam);
于 2008-09-29T18:59:34.023 に答える
4

これは、相互運用定数の優れたサイトです。

ピンヴォーク

値を見つける別の方法は、言語として C# を使用して、koders.com で 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]));
}

また、 SetForegroundWindowを使用して Chrome ウィンドウにフォーカスする必要があります。

于 2008-09-30T09:25:09.900 に答える