4

C# webbrowser コントロールとタブに値を自動入力し、入力して上下に押してフィールド間を移動しようとしています。

これが私の PInvoke とラッパー関数です。Spy++ を使用して Internet Explorer でこれらを取得しました。誰かが私の定義に何か問題があると思いますか? ウィンドウにフォーカスする必要がないため、SendInput の代わりに Send および Post メッセージを使用したい...

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll")]
    static extern int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

    const uint WM_KEYDOWN = 0x0100;
    const uint WM_KEYUP = 0x0101;
    const uint WM_CHAR = 0x0102;
    const int VK_TAB = 0x09;
    const int VK_ENTER = 0x0D;
    const int VK_UP = 0x26;
    const int VK_DOWN = 0x28;
    const int VK_RIGHT = 0x27;

    //According to SPY++ in IE

    //ENTER key is
    // P KEYDOWN
    // P CHAR
    // S CHAR
    // P KEY_UP

    //TAB key is
    // P KEYDOWN
    // P KEYUP

    //DOWN, UP, RIGHT, LEFT is
    // P KEYDOWN
    // S KEYDOWN
    // P KEYUP

    //Letters is
    // P KEYDOWN
    // S KEYDOWN
    // P CHAR
    // S CHAR
    // P KEYUP

    private void SendEnter()
    {
        PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)VK_ENTER, IntPtr.Zero);
        PostMessage(this.Handle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
        SendMessage(this.Handle, WM_CHAR, (IntPtr)VK_ENTER, IntPtr.Zero);
        PostMessage(this.Handle, WM_KEYUP, (IntPtr)VK_ENTER, IntPtr.Zero);
    }

    private void SendTab()
    {
        PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)VK_TAB, IntPtr.Zero);
        PostMessage(this.Handle, WM_KEYUP, (IntPtr)VK_TAB, IntPtr.Zero);
    }


    private void SendArrowKey(int key)
    {
        PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
        SendMessage(this.Handle, WM_KEYDOWN, (IntPtr)key, IntPtr.Zero);
        PostMessage(this.Handle, WM_KEYUP, (IntPtr)key, IntPtr.Zero);
    }

    private void SendChar(int key)
    {
        //Keydown wParam values are 0x020 less than WM_CHAR wParam
        PostMessage(this.Handle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
        SendMessage(this.Handle, WM_KEYDOWN, (IntPtr)(key - 0x020), IntPtr.Zero);
        PostMessage(this.Handle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
        SendMessage(this.Handle, WM_CHAR, (IntPtr)key, IntPtr.Zero);
        PostMessage(this.Handle, WM_KEYUP, (IntPtr)(key - 0x020), IntPtr.Zero);
    }
4

1 に答える 1

5

まず、WebBrowser ドキュメントのハンドルを取得することをお勧めします。

        IntPtr pControl; 
        IntPtr pControl2;
        pControl = FindWindowEx(WebWindow.Handle, IntPtr.Zero, "Shell Embedding", IntPtr.Zero);
        pControl = FindWindowEx(pControl, IntPtr.Zero, "Shell DocObject View", IntPtr.Zero);
        pControl = FindWindowEx(pControl, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero);
        pControl2 = FindWindowEx(pControl, IntPtr.Zero, "MacromediaFlashPlayerActiveX", IntPtr.Zero);

         if (pControl2 != IntPtr.Zero)
             pControl = pControl2;
             break;
        return pControl;

そのハンドルを使用して、重要なメッセージを送信します。

私が個人的に行っていることは、ボックスの位置にあるそのハンドルにクリックを送信してから、キーを送信することです

        PostMessage(pControl , (uint)MouseMessages.WM_MOUSEMOVE, 0, MAKELPARAM(x.X, x.Y));
        PostMessage(pControl , (uint)MouseMessages.WM_LBUTTONDOWN, 0, MAKELPARAM(x.X, x.Y));
        PostMessage(pControl , (uint)MouseMessages.WM_LBUTTONUP, 0, MAKELPARAM(x.X, x.Y));

このようなMAKELPARAMで:

    private int MAKELPARAM(int p, int p_2)
    {
        return ((p_2 << 16) | (p & 0xFFFF));
    }

私が目にしたことの 1 つは、フラッシュ以外のドキュメントで見つかった作業は、WM_CHAR のみの作業を送信することです。

このすべてで、ウィンドウにフォーカスする必要はありません

私はそれが役立つことを願っています:)

于 2013-09-19T13:57:26.140 に答える