2012-01-27 21 views
3

埋め込み内のキーストロークをシミュレートしたいと思いますSystem.Windows.Controls.WebBrowser。キーストロークをシミュレートするためのさまざまなテクニックは既にStackOverflowに記載されていますが、WebBrowserコントロールでは動作しません。コントロールが別のウィンドウ/ HWNDをラップし、私は次のように動作するように期待しているだろうことを知ってWebBrowserにキーストロークを送信するには?

は、しかし、そうではありません。

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

... 

SendMessage(myWebBrowser.Handle, WM_CHAR, key, 0); 

私はすでにWPFアプリケーションの他の部分にシミュレートされたキーストロークを転送するSendMessageを使用しています、一貫した解決策を好むだろう。これはWebBrowserの場合は失敗しています。

シミュレートされたキーストロークをWebBrowserに転送するにはどうすればよいですか?

+0

あなたは解決策を見つけましたか? – Sergey

+0

@Sergeyが投稿されました。ありがとう。 – DuckMaestro

答えて

3

私の解決策は、SendMessage()の代わりにSendInput()を使用することでした。追加型と定数については

[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)) 
    ); 
} 

私たちはそのシフトキーウィンドウを伝えるために必要がある場合は、長さが2または4依存の配列を返す2つのヘルパー・メソッドConvertCharToInputArray()ConvertKeyToInputArray()を、持っています押し下げられる。たとえば、次のように

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

だけ

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

中。

+0

なぜSendKeysを使用しないのですか? – Bytemain

0

私はVB6でこれを使用するのに慣れていますが、myWebBrowser.object.HandleまたはmyWebBrowser.object.HWNDに送信してみると、VB6で表示されますが、おそらく.Handleは.netバージョンにあります。

。オブジェクトを試して、それがどのように進むのか教えてください!

0

あなたはとても近かったです! pinvoke.netから

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); 

FindWindowEx定義:

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

強調表示されている入力のすべてが最も内側のハンドルに向けている間WebBrowser.Handleによって報告されたハンドルは、outter最もハンドルでありますWebブラウザコントロール: Highlighted is the WebBrowser control

関連する問題