cefsharp 发送 tab 键 - 不良行为
cefsharp send tab key - undesired behavior
您好,我是 cefsharp 的新手,我非常喜欢使用它。我 运行 感兴趣的一件事是,当我使用代码发送 TAB 键希望遍历网页时,它的行为不像人类的 Tab 键。
我使用的基本代码是来自此处的 winforms 代码:
https://github.com/cefsharp/CefSharp.MinimalExample
例如,当我在使用 google 搜索页面初始化浏览器后添加此代码时:
for (int i = 0; i < 1000; i++)
{
CefSharp.KeyEvent keyEvent = new KeyEvent();
keyEvent.WindowsKeyCode = (int)Keys.Tab;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.Char;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(50);
}
我期待的是手动在屏幕上切换,每次都聚焦其中一个页面元素,按照它们在页面上的位置顺序。
但是我发现网页上似乎并没有出现制表符,直到我在搜索框内单击时,它才会在框内添加制表符。使用手动 Tab 键,焦点将离开搜索框。当我将焦点设置到另一个页面元素(例如上图)时,它似乎并没有随着程序保持标签而失去焦点。
任何指示将不胜感激。
谢谢。
好的,这是我自己的解决方案的工作代码。有两种方法,一种是针对字符串,一种是针对特殊键。我没有做过广泛的测试,所以它可能不适合所有情况:
public static async Task SendStringToBrowser(this IWebBrowser browser, string sData)
{
var charArray = sData.ToCharArray();
foreach (char c in charArray)
{
CefSharp.KeyEvent keyEvent = new KeyEvent();
keyEvent.WindowsKeyCode = (int)c;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.Char;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(200);
}
}
public static async Task SendKeyToBrowser(this IWebBrowser browser, System.Windows.Forms.Keys key)
{
CefSharp.KeyEvent keyEvent = new KeyEvent();
keyEvent.WindowsKeyCode = (int)key;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.KeyDown;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(50);
keyEvent.WindowsKeyCode = (int)key;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.KeyUp;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(50);
}
要将字符串发送到浏览器,请执行以下操作:
await browser.SendStringToBrowser(sDataToSend);
要向浏览器发送特殊密钥,请执行以下操作:
await browser.SendKeyToBrowser(Keys.Tab);
您好,我是 cefsharp 的新手,我非常喜欢使用它。我 运行 感兴趣的一件事是,当我使用代码发送 TAB 键希望遍历网页时,它的行为不像人类的 Tab 键。
我使用的基本代码是来自此处的 winforms 代码: https://github.com/cefsharp/CefSharp.MinimalExample
例如,当我在使用 google 搜索页面初始化浏览器后添加此代码时:
for (int i = 0; i < 1000; i++)
{
CefSharp.KeyEvent keyEvent = new KeyEvent();
keyEvent.WindowsKeyCode = (int)Keys.Tab;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.Char;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(50);
}
我期待的是手动在屏幕上切换,每次都聚焦其中一个页面元素,按照它们在页面上的位置顺序。
但是我发现网页上似乎并没有出现制表符,直到我在搜索框内单击时,它才会在框内添加制表符。使用手动 Tab 键,焦点将离开搜索框。当我将焦点设置到另一个页面元素(例如上图)时,它似乎并没有随着程序保持标签而失去焦点。
任何指示将不胜感激。 谢谢。
好的,这是我自己的解决方案的工作代码。有两种方法,一种是针对字符串,一种是针对特殊键。我没有做过广泛的测试,所以它可能不适合所有情况:
public static async Task SendStringToBrowser(this IWebBrowser browser, string sData)
{
var charArray = sData.ToCharArray();
foreach (char c in charArray)
{
CefSharp.KeyEvent keyEvent = new KeyEvent();
keyEvent.WindowsKeyCode = (int)c;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.Char;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(200);
}
}
public static async Task SendKeyToBrowser(this IWebBrowser browser, System.Windows.Forms.Keys key)
{
CefSharp.KeyEvent keyEvent = new KeyEvent();
keyEvent.WindowsKeyCode = (int)key;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.KeyDown;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(50);
keyEvent.WindowsKeyCode = (int)key;
keyEvent.FocusOnEditableField = true;
keyEvent.IsSystemKey = false;
keyEvent.Type = KeyEventType.KeyUp;
browser.GetBrowser().GetHost().SendKeyEvent(keyEvent);
await Task.Delay(50);
}
要将字符串发送到浏览器,请执行以下操作:
await browser.SendStringToBrowser(sDataToSend);
要向浏览器发送特殊密钥,请执行以下操作:
await browser.SendKeyToBrowser(Keys.Tab);