4

我正在尝试在 C# webbrowser 控件和选项卡中自动填充值,然后输入并向上和向下按以在字段中移动。

这是我的 PInvoke 和包装函数。我使用 Spy++ 在 Internet Explorer 中获取这些内容。有人看到我的定义有什么问题吗?我想使用 Send and Post 消息而不是 SendInput 因为我不想聚焦窗口...

    [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

首先,我建议你拥有 WebBrownser 文档的句柄:

        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));
    }

我看到在非 Flash 文档上找到的一件事是仅发送 WM_CHAR 工作。

有了这一切,你不必有你的窗口焦点

我希望它有帮助:)

于 2013-09-19T13:57:26.140 回答