使用PostMessage / SendMessage将密钥发送到c#IE WebBrowser

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

这是我的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); } 

首先,我认为你拥有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(xX, xY)); PostMessage(pControl , (uint)MouseMessages.WM_LBUTTONDOWN, 0, MAKELPARAM(xX, xY)); PostMessage(pControl , (uint)MouseMessages.WM_LBUTTONUP, 0, MAKELPARAM(xX, xY)); 

与MAKELPARAM这样:

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

我看到非flash文档上的工作发现的一件事是发送WM_CHAR只能工作。

有了这一切,你不必把焦点放在窗户上

我希望它有帮助:)