使用 PostMessage/SendMessage 将密钥发送到 c# IE WebBrowser
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11368648/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using PostMessage/SendMessage to send keys to c# IE WebBrowser
提问by kyleb
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.
我正在尝试自动填充 C# webbrowser 控件和选项卡中的值,然后输入并上下按以在字段中移动。
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...
这是我的 PInvoke 和包装函数。我使用 Spy++ 在 Internet Explorer 中获取这些。有人看到我的定义有什么问题吗?我想使用 Send 和 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);
}
回答by Elbeau
First of all i sugest u to have the handle of the WebBrownser document :
首先,我建议您拥有 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;
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 :
像这样的 MAKELPARAM :
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.
我看到在非 Flash 文档上找到的工作的一件事是仅发送 WM_CHAR 工作。
With all this u don't have to have your window focus
有了这一切,你不必让你的窗口焦点
I hope it help :)
我希望它有帮助:)

