我有一个Web浏览器控件,它已导航到给定页面并准备就绪。现在,只要用户单击页面上的特定按钮,我就想调出Internet Explorer找到对话框。用户可以通过单击“ctrl + f”调出查找对话框,但我也想要一个单独的按钮来执行此操作。
我发现了这个: http://support.microsoft.com/kb/329014
但它有以下问题:
该页面显示此方法可能不适用于更高版本的Internet Explorer:
警告此示例使用 未记录的命令组GUID 将来可能会有变化。 虽然这个样本经过测试 与Internet Explorer正常工作 6及更早,没有保证 这些技术将继续下去 在未来版本中成功运作。
我无法编译代码。我添加了页面中描述的引用,但是我发现错误告诉AxSHDocVw名称空间无法找到。
答案 0 :(得分:5)
我自己找到了一个解决方案: 如果Web浏览器控件名称为“web”,则可以使用以下代码向其发送“Crtl + f”键:
web.Focus();
SendKeys.Send("^f");
我对此进行了测试,并在Internet Explorer 8上显示了查找对话框。
答案 1 :(得分:1)
我使用的是Windows7和.Net4.0 / WPF(不是Win Forms)。
的解决方案web.Focus();
SendKeys.Send("^f");
对我不起作用。首先,send命令抛出System.InvalidOperationException(说我的应用程序不处理事件,我应该使用SendKeys.SendWait())。其次,SendKeys.SendWait(“^ f”)什么都不做。
我的解决方案需要关注文档窗口而不是浏览器窗口:
System.Windows.Controls.WebBrowser HtmlView; //from xaml
HTMLDocument HtmlDoc { get { return (HTMLDocument)HtmlView.Document; } }
HtmlDoc.parentWindow.focus(); //when focusing this window sending Ctr-F has an effect
接下来我使用keybd_event()发送密钥消息
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags,
UIntPtr dwExtraInfo);
byte vKey_f = 0x46;
byte vKey_ctr = 0x11;
byte f_down = 0x21;
byte f_up = 0xa1;
byte ctrl_down = 0x1d;
byte ctrl_up = 0x9d;
byte event_keyup = 0x0002;
keybd_event(vKey_ctr, ctrl_down, 0, UIntPtr.Zero); // Ctrl Press
keybd_event(vKey_f, f_down, 0, UIntPtr.Zero); // f Press
keybd_event(vKey_f, f_up, event_keyup, UIntPtr.Zero); // f Release
keybd_event(vKey_ctr, ctrl_up, event_keyup, UIntPtr.Zero); // Ctrl Release
为什么“^ f”在我的情况下不起作用 - 我不知道。但是keybd_event()工作正常,尽管msdn(http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304(v=vs.85).aspx)声明“此函数已被取代。请改用SendInput。”。我尝试了SendInput()但看不到效果。
keybd_event()的更多信息: