Using PostMessage/SendMessage to send keys to c# IE WebBrowser
c#, pinvoke, windows-messages
Solution
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 :)
Problem
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); } ```