2012-01-27 45 views
3

我想模拟一个嵌入式System.Windows.Controls.WebBrowser内的按键。用于模拟击键的各种技术已经在StackOverflow中进行了介绍,但是它们似乎不适用于WebBrowser控件。如何向WebBrowser发送击键?

知道的是,控制包装另一个窗口/ HWND,我本来期望以下工作但它不是:

[DllImport("user32.dll")] 
private static extern int SendMessage(IntPtr hWnd, uint msg, int wParam, int lParam); 

... 

SendMessage(myWebBrowser.Handle, WM_CHAR, key, 0); 
我已经使用 SendMessage转发模拟击键WPF应用程序的其他部分

,并希望有一个一致的解决方案;但是这是WebBrowser的失败。

如何将模拟击键转发到WebBrowser

+0

您是否找到了解决方案? – Sergey 2012-09-22 14:51:29

+0

@Sergey发布。谢谢。 – DuckMaestro 2012-09-22 23:17:24

回答

3

我的解决方法是使用SendInput()而不是SendMessage()

进口:

[DllImport("user32.dll", SetLastError = true)] 
public static extern uint SendInput(uint nInputs, User32.Input[] pInputs, int cbSize); 

对于其他类型和常量在这里看到:http://pinvoke.net/default.aspx/user32/SendInput.html

对于预期的行为在这里看到:http://msdn.microsoft.com/en-us/library/windows/desktop/ms646310(v=vs.85).aspx

我的虚拟按键方法:

private void VirtualKeypress(Key keyCode, bool shift, char keyChar) 
{ 
    User32.Input[] inputSequence; 
    if (keyChar == '\0' && keyCode == Key.None) 
    { 
     throw new ArgumentException("Expected a key code or key char, not both."); 
    } 
    else if (keyChar != '\0') 
    { 
     inputSequence = KeyboardUtils.ConvertCharToInputArray(keyChar); 
    } 
    else 
    { 
     inputSequence = KeyboardUtils.ConvertKeyToInputArray(keyCode, shift); 
    } 

    User32.SendInput(
     (uint)inputSequence.Length, 
     inputSequence, 
     Marshal.SizeOf(typeof(User32.Input)) 
    ); 
} 

我有两个辅助方法ConvertCharToInputArray()ConvertKeyToInputArray(),其返回长度为2或4取决于阵列如果我们需要告诉窗户变速键郁闷。例如:

'A' -> [] { shift down, A down, A up, shift up } 

而只是

'a' -> [] { A down, A up } 

+0

为什么不使用SendKeys? – Bytemain 2016-12-07 13:16:00

0

嗯,我只习惯于在VB6中使用它,但尝试发送到myWebBrowser.object.Handle或myWebBrowser.object.HWND是我在VB6中看到的,但你可能有.Handle在你的.net版本。

尝试.object,让我知道它是怎么回事!

0

你太亲近了!通过WebBrowser.Handle报道手柄是outter最手柄,而所有的输入被引导到内最手柄:

var hwnd = _browser.Handle; 
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Shell Embedding", null); 
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Shell DocObject View", null); 
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Internet Explorer_Server", null); 

SendMessage(hwnd, WM_CHAR, new IntPtr(0x0D), IntPtr.Zero); 

从pinvoke.net FindWindowEx定义:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

突出显示的是WebBrowser控件: Highlighted is the WebBrowser control