WinForms WebBrowser 控件無直接模擬點擊方法,需透過 Windows API SendMessage 向內部 IE 視窗發送 WM_LBUTTONDOWN/WM_LBUTTONUP。
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace BrowserMouseClick
{
public partial class Form1 : Form
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("https://www.example.com");
}
private void btnMouseClick_Click(object sender, EventArgs e)
{
int x = 100, y = 80; // 點擊座標
IntPtr handle = webBrowser1.Handle;
var sb = new StringBuilder(100);
// 向下尋找 Internet Explorer_Server 類別視窗
while (sb.ToString() != "Internet Explorer_Server")
{
handle = GetWindow(handle, 5); // GW_CHILD = 5
GetClassName(handle, sb, sb.Capacity);
}
IntPtr lParam = (IntPtr)((y << 16) | x);
IntPtr wParam = IntPtr.Zero;
const uint WM_LBUTTONDOWN = 0x201;
const uint WM_LBUTTONUP = 0x202;
SendMessage(handle, WM_LBUTTONDOWN, wParam, lParam);
SendMessage(handle, WM_LBUTTONUP, wParam, lParam);
}
}
}
| API | 用途 |
|---|---|
| GetWindow(hWnd, 5) | 取得子視窗句柄 (GW_CHILD) |
| GetClassName | 確認視窗類別名稱為 "Internet Explorer_Server" |
| lParam = (y << 16) | x | 將 X、Y 座標打包 |
| WM_LBUTTONDOWN/UP | 模擬滑鼠左鍵按下/放開 |