使用PostMessage的/ SendMessage函数发送键C#web浏览器IE [英] Using PostMessage/SendMessage to send keys to c# IE WebBrowser

查看:2312
本文介绍了使用PostMessage的/ SendMessage函数发送键C#web浏览器IE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图自动填写在C#WebBrowser控件和标签值和输入,按上下贯通领域的移动。



下面是我的PInvoke和封装功能。我用间谍++在Internet Explorer中得到这些。有谁看到什么错我的定义是什么?我想用发送和张贴消息,而不是SendInput,因为我不希望有集中的窗口...

 函数[DllImport(user32.dll中)] 
[返回:的MarshalAs(UnmanagedType.Bool)
静态的extern BOOL PostMessage的(IntPtr的的HWND,UINT味精,IntPtr的的wParam,lParam的IntPtr的);

函数[DllImport(user32.dll中)]
静态外部INT SendMessage函数(IntPtr的的HWND,UINT味精,IntPtr的的wParam,lParam的IntPtr的);

常量UINT WM_KEYDOWN = 0100;
常量UINT WM_KEYUP = 0x0101;
常量UINT WM_CHAR = 0x0102;
const int的VK_TAB = 0×09;
const int的VK_ENTER = 0X0D;
const int的VK_UP = 0×26;
const int的VK_DOWN = 0x28;
const int的VK_RIGHT = 0×27;

//根据SPY ++在IE

// ENTER键为
// P KEYDOWN
// P CHAR
//小号CHAR
// P KEY_UP

// TAB键是
// P KEYDOWN
// P KEYUP

// DOWN ,上,右,左为
// P KEYDOWN
//小号KEYDOWN
// P KEYUP

//信件是
// P KEYDOWN
//小号KEYDOWN
// P CHAR
//小号CHAR
// P KEYUP

私人无效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);
}

私人无效SendTab()
{
PostMessage的(this.Handle,WM_KEYDOWN,(IntPtr的)VK_TAB,IntPtr.Zero);
PostMessage的(this.Handle,WM_KEYUP,(IntPtr的)VK_TAB,IntPtr.Zero);
}


私人无效SendArrowKey(INT键)
{
PostMessage的(this.Handle,WM_KEYDOWN,(IntPtr的)键,IntPtr.Zero) ;
SendMessage函数(this.Handle,WM_KEYDOWN,(IntPtr的)键,IntPtr.Zero);
PostMessage的(this.Handle,WM_KEYUP,(IntPtr的)键,IntPtr.Zero);
}

私人无效SendChar(INT键)
{
// KEYDOWN的wParam值量0x020不到WM_CHAR的wParam
PostMessage的(this.Handle, WM_KEYDOWN,(IntPtr的)(键 - 量0x020),IntPtr.Zero);
SendMessage函数(this.Handle,WM_KEYDOWN,(IntPtr的)(键 - 量0x020),IntPtr.Zero);
PostMessage的(this.Handle,WM_CHAR,(IntPtr的)键,IntPtr.Zero);
SendMessage函数(this.Handle,WM_CHAR,(IntPtr的)键,IntPtr.Zero);
PostMessage的(this.Handle,WM_KEYUP,(IntPtr的)(键 - 量0x020),IntPtr.Zero);
}


解决方案

首先我sugestü有WebBrownser文件句柄:

  IntPtr的PControl则; 
IntPtr的pControl2;
PControl则= FindWindowEx(WebWindow.Handle,IntPtr.Zero,壳牌嵌入,IntPtr.Zero);
PControl则= FindWindowEx(PControl则,IntPtr.Zero,壳牌DocObject的视图,IntPtr.Zero);
PControl则= FindWindowEx(PControl则,IntPtr.Zero,互联网Explorer_Server,IntPtr.Zero);
pControl2 = FindWindowEx(PControl则,IntPtr.Zero,MacromediaFlashPlayerActiveX,IntPtr.Zero);

如果(pControl2 = IntPtr.Zero!)
PControl则= pControl2;
中断;
返回PControl则;



使用该句柄来发送关键信息。



什么即时通讯做personnally是我送一个点击该处理在框的位置,然后把我的钥匙

  PostMessage的(PControl则,(UINT)MouseMessages.WM_MOUSEMOVE,0,MAKELPARAM(XX,XY)); 
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:

 私人诠释MAKELPARAM(INT p,INT P_2)
{
回报率((P_2<< 16)|(p&安培; 0xFFFF的));
}

有一件事我看到非Flash文档的工作发现是发送WM_CHAR只有工作。



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



我希望它能帮助:)


I am trying to auto fill in values in the C# webbrowser control and tab and enter and press up and down to move through the fields.

Here is my PInvoke and wrapper functions. I used Spy++ to get these in Internet Explorer. Does anyone see anything wrong with my definitions? I want to use Send and Post message instead of SendInput because I don't want to have to focus the window...

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

解决方案

First of all i sugest u to have the handle of the WebBrownser document :

        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;

Use that handle to send your key message.

What im doing personnally is that i send a click to that Handle at the position of the box and then send my keys

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

with MAKELPARAM like this :

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

The one thing i saw that work find on non flash document is to send WM_CHAR only work.

With all this u don't have to have your window focus

I hope it help :)

这篇关于使用PostMessage的/ SendMessage函数发送键C#web浏览器IE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆