2012-01-27 63 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