WebBrowser 控制項 (IE 內核) 預設不暴露網頁內部的滑鼠事件給 C#。透過向 DOM 注入 JavaScript,攔截事件並導航至自訂協定 URI (cmd://...),再在 Navigating 事件中攔截並取消導航,即可實現 C# 捕獲網頁點擊。
document.onmousedown = function() { window.location = 'cmd://onmousedown'; }。WebBrowser.Navigating 檢查 e.Url 是否為自訂協定,若是則 e.Cancel = true 並處理邏輯。SHDocVw.WebBrowser 掛接 NavigateComplete2 確保每次頁面載入都重新注入 JS。
using System;
using System.Windows.Forms;
using mshtml;
using SHDocVw;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigating += WebBrowser1_Navigating;
webBrowser1.Navigate("https://www.google.com");
var ax = (SHDocVw.WebBrowser)webBrowser1.ActiveXInstance;
ax.NavigateComplete2 += Ax_NavigateComplete2;
}
private void WebBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
if (e.Url.ToString().ToLower().Trim('/') == "cmd://onmousedown")
{
MessageBox.Show("捕獲到滑鼠按下!");
e.Cancel = true;
}
}
private void Ax_NavigateComplete2(object pDisp, ref object URL)
{
var doc = (IHTMLDocument2)((SHDocVw.WebBrowser)webBrowser1.ActiveXInstance).Document;
doc.parentWindow.execScript("document.onmousedown=function(){window.location='cmd://onmousedown'}", "JavaScript");
}
}
}
Microsoft.mshtml (mshtml.dll) 與 Microsoft Internet Controls (SHDocVw.dll) COM 參考。cmd:// 非標準協定,不會觸發真實導航,僅作為訊號。onclick、oncontextmenu、onkeydown 等。event.clientX/Y 並附加至 URI:cmd://click?x=100&y=200,C# 端解析。WebBrowser 基於 IE 7/11 內核,已棄用且不支援現代 Web 標準。新專案請改用:
CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync + WebMessageReceived 事件,原生支援雙向通訊。