IFBroSharpBrowser接口鼠标键盘操作完整指南
📋 文档概述
本文档详细介绍IFBroSharpBrowser接口中包含的所有鼠标键盘操作方法。这些方法为浏览器自动化提供了完整的用户交互模拟能力,可以实现几乎所有的用户操作场景。
🎯 适用场景
- UI自动化测试:模拟用户的各种交互操作
- 数据采集爬虫:自动化表单填写和页面操作
- 游戏辅助工具:模拟鼠标键盘操作
- 办公自动化:批量处理Web应用操作
🚀 快速开始
csharp
// 基础使用模式
if (browser != null && browser.IsValid)
{
// 创建鼠标事件对象
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = 100;
mouseEvent.Y = 200;
// 发送鼠标点击
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, false, 1);
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, true, 1);
}🖱️ 鼠标操作方法
1. SendMouseClickEvent - 鼠标点击事件
方法签名
csharp
void SendMouseClickEvent(FBroSharpMouseButtonType ButtonType, FBroSharpMouseEvent mouserEvent, bool mouseUp, int clickCount);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
ButtonType | FBroSharpMouseButtonType | 鼠标按钮类型(左键/右键/中键) |
mouserEvent | FBroSharpMouseEvent | 鼠标事件对象(包含坐标等信息) |
mouseUp | bool | true=松开鼠标,false=按下鼠标 |
clickCount | int | 点击次数(1=单击,2=双击) |
鼠标按钮类型枚举
csharp
public enum FBroSharpMouseButtonType
{
MBT_LEFT, // 左键
MBT_MIDDLE, // 中键(滚轮键)
MBT_RIGHT // 右键
}使用示例
csharp
/// <summary>
/// 执行鼠标左键单击
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
public void ClickLeftButton(int x, int y)
{
if (browser != null && browser.IsValid)
{
// 创建鼠标事件对象
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 模拟鼠标按下
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, false, 1);
// 稍作延迟(可选)
Thread.Sleep(50);
// 模拟鼠标松开
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, true, 1);
Console.WriteLine($"已在坐标({x}, {y})执行鼠标左键点击");
}
}
/// <summary>
/// 执行鼠标右键点击
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
public void ClickRightButton(int x, int y)
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 右键点击
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_RIGHT, mouseEvent, false, 1);
Thread.Sleep(50);
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_RIGHT, mouseEvent, true, 1);
Console.WriteLine($"已在坐标({x}, {y})执行鼠标右键点击");
}
}
/// <summary>
/// 执行鼠标双击
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
public void DoubleClick(int x, int y)
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 双击操作
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, false, 2);
Thread.Sleep(50);
browser.SendMouseClickEvent(FBroSharpMouseButtonType.MBT_LEFT, mouseEvent, true, 2);
Console.WriteLine($"已在坐标({x}, {y})执行鼠标双击");
}
}2. SendMouseMoveEvent - 鼠标移动事件
方法签名
csharp
void SendMouseMoveEvent(FBroSharpMouseEvent mouserEvent, bool mouseLeave);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
mouserEvent | FBroSharpMouseEvent | 鼠标事件对象(包含目标坐标) |
mouseLeave | bool | 是否为鼠标离开事件 |
使用示例
csharp
/// <summary>
/// 移动鼠标到指定位置
/// </summary>
/// <param name="x">目标X坐标</param>
/// <param name="y">目标Y坐标</param>
public void MoveMouse(int x, int y)
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 移动鼠标到指定位置
browser.SendMouseMoveEvent(mouseEvent, false);
Console.WriteLine($"鼠标已移动到坐标({x}, {y})");
}
}
/// <summary>
/// 模拟鼠标悬停效果
/// </summary>
/// <param name="x">悬停X坐标</param>
/// <param name="y">悬停Y坐标</param>
/// <param name="hoverTime">悬停时间(毫秒)</param>
public void HoverMouse(int x, int y, int hoverTime = 1000)
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 移动到目标位置
browser.SendMouseMoveEvent(mouseEvent, false);
Console.WriteLine($"鼠标悬停在坐标({x}, {y})");
// 保持悬停
Thread.Sleep(hoverTime);
// 可选:移开鼠标
mouseEvent.X = x + 50;
mouseEvent.Y = y + 50;
browser.SendMouseMoveEvent(mouseEvent, true);
Console.WriteLine("鼠标悬停结束");
}
}
/// <summary>
/// 平滑移动鼠标(模拟真实鼠标移动)
/// </summary>
/// <param name="fromX">起始X坐标</param>
/// <param name="fromY">起始Y坐标</param>
/// <param name="toX">目标X坐标</param>
/// <param name="toY">目标Y坐标</param>
/// <param name="steps">移动步数</param>
public void SmoothMoveMouse(int fromX, int fromY, int toX, int toY, int steps = 10)
{
if (browser != null && browser.IsValid)
{
for (int i = 0; i <= steps; i++)
{
int currentX = fromX + (toX - fromX) * i / steps;
int currentY = fromY + (toY - fromY) * i / steps;
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = currentX;
mouseEvent.Y = currentY;
browser.SendMouseMoveEvent(mouseEvent, false);
Thread.Sleep(20); // 控制移动速度
}
Console.WriteLine($"鼠标已平滑移动从({fromX}, {fromY})到({toX}, {toY})");
}
}3. SendMouseWheelEvent - 鼠标滚轮事件
方法签名
csharp
void SendMouseWheelEvent(FBroSharpMouseEvent mouserEvent, int deltaX, int deltaY);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
mouserEvent | FBroSharpMouseEvent | 鼠标事件对象(滚轮位置) |
deltaX | int | 水平滚动增量 |
deltaY | int | 垂直滚动增量 |
使用示例
csharp
/// <summary>
/// 垂直滚动页面
/// </summary>
/// <param name="x">滚轮位置X坐标</param>
/// <param name="y">滚轮位置Y坐标</param>
/// <param name="scrollAmount">滚动量(正数向上,负数向下)</param>
public void ScrollVertical(int x, int y, int scrollAmount)
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 垂直滚动
browser.SendMouseWheelEvent(mouseEvent, 0, scrollAmount);
string direction = scrollAmount > 0 ? "向上" : "向下";
Console.WriteLine($"在坐标({x}, {y})执行{direction}滚动,滚动量:{Math.Abs(scrollAmount)}");
}
}
/// <summary>
/// 水平滚动页面
/// </summary>
/// <param name="x">滚轮位置X坐标</param>
/// <param name="y">滚轮位置Y坐标</param>
/// <param name="scrollAmount">滚动量(正数向右,负数向左)</param>
public void ScrollHorizontal(int x, int y, int scrollAmount)
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = x;
mouseEvent.Y = y;
// 水平滚动
browser.SendMouseWheelEvent(mouseEvent, scrollAmount, 0);
string direction = scrollAmount > 0 ? "向右" : "向左";
Console.WriteLine($"在坐标({x}, {y})执行{direction}滚动,滚动量:{Math.Abs(scrollAmount)}");
}
}
/// <summary>
/// 滚动到页面顶部
/// </summary>
public void ScrollToTop()
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = 500; // 页面中央
mouseEvent.Y = 300;
// 大幅度向上滚动
for (int i = 0; i < 10; i++)
{
browser.SendMouseWheelEvent(mouseEvent, 0, 120);
Thread.Sleep(50);
}
Console.WriteLine("页面已滚动到顶部");
}
}
/// <summary>
/// 滚动到页面底部
/// </summary>
public void ScrollToBottom()
{
if (browser != null && browser.IsValid)
{
var mouseEvent = new FBroSharpMouseEvent();
mouseEvent.X = 500; // 页面中央
mouseEvent.Y = 300;
// 大幅度向下滚动
for (int i = 0; i < 10; i++)
{
browser.SendMouseWheelEvent(mouseEvent, 0, -120);
Thread.Sleep(50);
}
Console.WriteLine("页面已滚动到底部");
}
}⌨️ 键盘操作方法
4. SendKeyEvent - 键盘按键事件
方法签名
csharp
void SendKeyEvent(FBroSharpKeyEvent keyevent);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
keyevent | FBroSharpKeyEvent | 键盘事件对象 |
FBroSharpKeyEvent 对象属性
csharp
public class FBroSharpKeyEvent
{
public int WindowsKeyCode { get; set; } // Windows键码
public int NativeKeyCode { get; set; } // 原生键码
public bool IsSystemKey { get; set; } // 是否为系统键
public int Modifiers { get; set; } // 修饰键(Ctrl、Alt、Shift等)
public char Character { get; set; } // 字符
public FBroSharpKeyEventType Type { get; set; } // 事件类型
}键盘事件类型
csharp
public enum FBroSharpKeyEventType
{
KEYEVENT_RAWKEYDOWN, // 按键按下(原始事件)
KEYEVENT_KEYDOWN, // 按键按下
KEYEVENT_KEYUP, // 按键松开
KEYEVENT_CHAR // 字符输入
}使用示例
csharp
/// <summary>
/// 发送单个字符
/// </summary>
/// <param name="character">要发送的字符</param>
public void SendCharacter(char character)
{
if (browser != null && browser.IsValid)
{
var keyEvent = new FBroSharpKeyEvent();
keyEvent.Type = FBroSharpKeyEventType.KEYEVENT_CHAR;
keyEvent.Character = character;
keyEvent.WindowsKeyCode = (int)character;
browser.SendKeyEvent(keyEvent);
Console.WriteLine($"已发送字符: {character}");
}
}
/// <summary>
/// 发送文本字符串
/// </summary>
/// <param name="text">要发送的文本</param>
public void SendText(string text)
{
if (browser != null && browser.IsValid)
{
foreach (char c in text)
{
SendCharacter(c);
Thread.Sleep(50); // 模拟真实输入速度
}
Console.WriteLine($"已发送文本: {text}");
}
}
/// <summary>
/// 发送按键(按下和松开)
/// </summary>
/// <param name="keyCode">按键码</param>
public void SendKey(int keyCode)
{
if (browser != null && browser.IsValid)
{
// 按键按下
var keyDownEvent = new FBroSharpKeyEvent();
keyDownEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYDOWN;
keyDownEvent.WindowsKeyCode = keyCode;
browser.SendKeyEvent(keyDownEvent);
Thread.Sleep(50);
// 按键松开
var keyUpEvent = new FBroSharpKeyEvent();
keyUpEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYUP;
keyUpEvent.WindowsKeyCode = keyCode;
browser.SendKeyEvent(keyUpEvent);
Console.WriteLine($"已发送按键,键码: {keyCode}");
}
}
/// <summary>
/// 发送Enter键
/// </summary>
public void SendEnter()
{
SendKey(13); // Enter键的键码
Console.WriteLine("已发送Enter键");
}
/// <summary>
/// 发送Tab键
/// </summary>
public void SendTab()
{
SendKey(9); // Tab键的键码
Console.WriteLine("已发送Tab键");
}
/// <summary>
/// 发送Backspace键
/// </summary>
public void SendBackspace()
{
SendKey(8); // Backspace键的键码
Console.WriteLine("已发送Backspace键");
}
/// <summary>
/// 发送组合键(如Ctrl+A)
/// </summary>
/// <param name="modifier">修饰键</param>
/// <param name="key">主键</param>
public void SendCombinationKey(int modifier, int key)
{
if (browser != null && browser.IsValid)
{
// 按下修饰键
var modifierDownEvent = new FBroSharpKeyEvent();
modifierDownEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYDOWN;
modifierDownEvent.WindowsKeyCode = modifier;
modifierDownEvent.Modifiers = GetModifierFlag(modifier);
browser.SendKeyEvent(modifierDownEvent);
Thread.Sleep(50);
// 按下主键
var keyDownEvent = new FBroSharpKeyEvent();
keyDownEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYDOWN;
keyDownEvent.WindowsKeyCode = key;
keyDownEvent.Modifiers = GetModifierFlag(modifier);
browser.SendKeyEvent(keyDownEvent);
Thread.Sleep(50);
// 松开主键
var keyUpEvent = new FBroSharpKeyEvent();
keyUpEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYUP;
keyUpEvent.WindowsKeyCode = key;
keyUpEvent.Modifiers = GetModifierFlag(modifier);
browser.SendKeyEvent(keyUpEvent);
Thread.Sleep(50);
// 松开修饰键
var modifierUpEvent = new FBroSharpKeyEvent();
modifierUpEvent.Type = FBroSharpKeyEventType.KEYEVENT_KEYUP;
modifierUpEvent.WindowsKeyCode = modifier;
browser.SendKeyEvent(modifierUpEvent);
Console.WriteLine($"已发送组合键,修饰键: {modifier}, 主键: {key}");
}
}
/// <summary>
/// 获取修饰键标志
/// </summary>
/// <param name="keyCode">修饰键键码</param>
/// <returns>修饰键标志</returns>
private int GetModifierFlag(int keyCode)
{
switch (keyCode)
{
case 17: return 0x04; // Ctrl
case 18: return 0x08; // Alt
case 16: return 0x02; // Shift
default: return 0x00;
}
}
/// <summary>
/// 全选文本(Ctrl+A)
/// </summary>
public void SelectAll()
{
SendCombinationKey(17, 65); // Ctrl + A
Console.WriteLine("已执行全选操作");
}
/// <summary>
/// 复制文本(Ctrl+C)
/// </summary>
public void Copy()
{
SendCombinationKey(17, 67); // Ctrl + C
Console.WriteLine("已执行复制操作");
}
/// <summary>
/// 粘贴文本(Ctrl+V)
/// </summary>
public void Paste()
{
SendCombinationKey(17, 86); // Ctrl + V
Console.WriteLine("已执行粘贴操作");
}5. SendFocusEvent - 焦点事件
方法签名
csharp
void SendFocusEvent(bool setFocus);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
setFocus | bool | true=设置焦点,false=失去焦点 |
使用示例
csharp
/// <summary>
/// 设置浏览器焦点
/// </summary>
public void SetBrowserFocus()
{
if (browser != null && browser.IsValid)
{
browser.SendFocusEvent(true);
Console.WriteLine("浏览器已获得焦点");
}
}
/// <summary>
/// 取消浏览器焦点
/// </summary>
public void RemoveBrowserFocus()
{
if (browser != null && browser.IsValid)
{
browser.SendFocusEvent(false);
Console.WriteLine("浏览器已失去焦点");
}
}
/// <summary>
/// 为输入操作准备焦点
/// </summary>
/// <param name="x">输入框X坐标</param>
/// <param name="y">输入框Y坐标</param>
/// <param name="text">要输入的文本</param>
public void FocusAndInput(int x, int y, string text)
{
if (browser != null && browser.IsValid)
{
// 1. 点击输入框获得焦点
ClickLeftButton(x, y);
Thread.Sleep(200);
// 2. 确保浏览器有焦点
SetBrowserFocus();
Thread.Sleep(100);
// 3. 清空现有内容(Ctrl+A + Delete)
SelectAll();
Thread.Sleep(100);
SendKey(46); // Delete键
Thread.Sleep(100);
// 4. 输入新文本
SendText(text);
Console.WriteLine($"已在坐标({x}, {y})输入文本: {text}");
}
}6. SendTouchEvent - 触摸事件
方法签名
csharp
void SendTouchEvent(FBroSharpTouchEvent touchEvent);参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
touchEvent | FBroSharpTouchEvent | 触摸事件对象 |
使用示例
csharp
/// <summary>
/// 发送触摸点击事件
/// </summary>
/// <param name="x">触摸X坐标</param>
/// <param name="y">触摸Y坐标</param>
public void SendTouchClick(int x, int y)
{
if (browser != null && browser.IsValid)
{
var touchEvent = new FBroSharpTouchEvent();
// 配置触摸事件参数
// 注:具体参数配置需要参考FBroSharpTouchEvent的定义
browser.SendTouchEvent(touchEvent);
Console.WriteLine($"已在坐标({x}, {y})发送触摸点击事件");
}
}🔧 综合使用示例
表单自动填写示例
csharp
/// <summary>
/// 自动填写登录表单
/// </summary>
/// <param name="usernameX">用户名输入框X坐标</param>
/// <param name="usernameY">用户名输入框Y坐标</param>
/// <param name="passwordX">密码输入框X坐标</param>
/// <param name="passwordY">密码输入框Y坐标</param>
/// <param name="loginButtonX">登录按钮X坐标</param>
/// <param name="loginButtonY">登录按钮Y坐标</param>
/// <param name="username">用户名</param>
/// <param name="password">密码</param>
public void AutoLogin(int usernameX, int usernameY, int passwordX, int passwordY,
int loginButtonX, int loginButtonY, string username, string password)
{
if (browser != null && browser.IsValid)
{
try
{
Console.WriteLine("开始自动登录...");
// 1. 填写用户名
Console.WriteLine("填写用户名...");
FocusAndInput(usernameX, usernameY, username);
Thread.Sleep(500);
// 2. 填写密码
Console.WriteLine("填写密码...");
FocusAndInput(passwordX, passwordY, password);
Thread.Sleep(500);
// 3. 点击登录按钮
Console.WriteLine("点击登录按钮...");
ClickLeftButton(loginButtonX, loginButtonY);
Console.WriteLine("自动登录完成");
}
catch (Exception ex)
{
Console.WriteLine($"自动登录失败: {ex.Message}");
}
}
}页面操作示例
csharp
/// <summary>
/// 综合页面操作示例
/// </summary>
public void ComprehensivePageOperation()
{
if (browser != null && browser.IsValid)
{
Console.WriteLine("开始执行综合页面操作...");
// 1. 滚动到页面顶部
ScrollToTop();
Thread.Sleep(1000);
// 2. 平滑移动鼠标到页面中央
SmoothMoveMouse(0, 0, 500, 300, 20);
Thread.Sleep(500);
// 3. 模拟鼠标悬停
HoverMouse(500, 300, 2000);
Thread.Sleep(500);
// 4. 向下滚动一些
ScrollVertical(500, 300, -300);
Thread.Sleep(1000);
// 5. 右键点击
ClickRightButton(500, 300);
Thread.Sleep(1000);
// 6. 按ESC键关闭右键菜单
SendKey(27); // ESC键
Thread.Sleep(500);
// 7. 使用键盘快捷键刷新页面
SendCombinationKey(17, 82); // Ctrl + R
Console.WriteLine("综合页面操作完成");
}
}⚠️ 重要注意事项
1. 线程安全
- 所有UI相关操作必须在UI线程中执行
- 避免在多个线程中同时操作同一个浏览器实例
2. 坐标系统
- 坐标相对于浏览器视图的左上角
- 确保坐标在浏览器可视区域内
3. 时间控制
- 操作之间适当添加延迟,模拟真实用户行为
- 过快的操作可能导致页面响应不及时
4. 错误处理
csharp
/// <summary>
/// 安全的鼠标点击操作
/// </summary>
/// <param name="x">X坐标</param>
/// <param name="y">Y坐标</param>
/// <returns>操作是否成功</returns>
public bool SafeClick(int x, int y)
{
try
{
if (browser == null || !browser.IsValid)
{
Console.WriteLine("浏览器实例无效");
return false;
}
ClickLeftButton(x, y);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"点击操作失败: {ex.Message}");
return false;
}
}5. 资源管理
- 长时间操作后,注意释放相关资源
- 监控内存使用情况,避免内存泄漏
6. 调试技巧
csharp
/// <summary>
/// 启用调试模式的操作记录
/// </summary>
public bool DebugMode { get; set; } = false;
private void LogOperation(string operation)
{
if (DebugMode)
{
Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] {operation}");
}
}📖 相关文档
🎯 总结
IFBroSharpBrowser接口提供了完整的用户交互模拟能力,通过合理使用这些方法,可以实现复杂的浏览器自动化操作。在实际使用中,建议:
- 逐步构建:从简单的单个操作开始,逐步组合成复杂的操作序列
- 充分测试:在不同的页面和环境中测试操作的稳定性
- 错误处理:为所有操作添加适当的错误处理和重试机制
- 性能优化:避免不必要的延迟,提高操作效率
- 用户体验:模拟真实用户行为,避免过于机械化的操作模式