Using PostMessage/SendMessage to send keys to c# IE WebBrowser

匿名 (未验证) 提交于 2019-12-03 08:59:04

问题:

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

回答1:

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!