c# 开发 ActiveX,用 JS 怎么捕获事件
js 代码:
<input type="button" value="发送消息" onclick="Send();" />
<input type="text" id="txtData" />
<object id="GpsActiveX" classid="clsid:31B11F5C-5B01-4A8C-8119-3710CB1C8ECC">
</object>
<script type="text/javascript" language="javascript">
GpsActiveX.Init(window, '192.168.16.14', '8000');
function ClientTest(t) {
alert(t);
}
function Send() {
GpsActiveX.SendToServer(document.getElementById("txtData").value);
}
</script>
<script language="javascript" event="OnGps(vid,gps)" for="GpsActiveX">
alert(vid);
</script>
比如这个 OnGps 怎么在 OCX 抛出来给 JS 获取
以上可以调用 OXC 里面的方法,就是事件,在 OCX 里面不知道怎么写,才能让 event 捕获。
c#代码:
[Guid("31B11F5C-5B01-4A8C-8119-3710CB1C8ECC")]
public partial class WebGpsServer : UserControl, IObjectSafety
{
mshtml.HTMLWindow2Class html;//执行客户端脚本
string ip = "127.0.0.1";
int port = 8000;
private IPAddress serverIP;
private IPEndPoint serverFullAddr;
private Socket sock;
public WebGpsServer()
{
InitializeComponent();
}
#region IObjectSafety 成员
//............
#endregion
public void Init(object obj, string ip, int port)
{
html = (mshtml.HTMLWindow2Class)obj;
this.ip = ip;
this.port = port;
Start();
}
private void Start()
{
serverIP = IPAddress.Parse(ip);
serverFullAddr = new IPEndPoint(serverIP, port);
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Connect(serverFullAddr);
Thread t = new Thread(new ThreadStart(ReceiveMsg));
t.Name = "Receive Message";
t.IsBackground = true;
t.Start();
byte[] byteSend = System.Text.Encoding.GetEncoding("gb2312").GetBytes("新成员:" + Dns.GetHostName() + "\n");
try
{
this.sock.Send(byteSend);
}
catch
{
html.execScript("ClientTest('Error');", "javascript");
}
html.execScript("ClientTest('连接成功!');", "javascript");//html.execScript这个是执行客户端的 JS 方法
}
private void ReceiveMsg()
{
try
{
while (true)
{
byte[] byteRec = new byte[100];
this.sock.Receive(byteRec);
string strRec = System.Text.Encoding.GetEncoding("gb2312").GetString(byteRec);
if (this.label1.InvokeRequired)
{
this.label1.Invoke(new EventHandler(ChangeRtb), new object[] { strRec, EventArgs.Empty });
}
// 这里不能使用 html.execScript 这种方法,所以想修改成捕获事件
//异常如下:无法将类型为 mshtml.HTMLWindow2Class 的 COM 对象强制转换为接口类型 mshtml.DispHTMLWindow2
//html.execScript("ClientTest('" + strRec + "');", "javascript");
}
}
catch (Exception ex)
{
MessageBox.Show("Receive Message Error" + ex.Message);
}
}
private void ChangeRtb(object obj, EventArgs e)
{
string s = System.Convert.ToString(obj);
label1.Text = s;
// 这里不能使用 html.execScript 这种方法,所以想修改成捕获事件
//异常信息如下:由于出现错误 80080101 而导致此项操作无法完成
//html.execScript("ClientTest('" + s + "');", "javascript");
}
//发送消息给服务器
public void SendToServer(string datas)
{
byte[] byteSend = System.Text.Encoding.GetEncoding("gb2312").GetBytes(Dns.GetHostName() + ": " + datas + "\n");
this.sock.Send(byteSend);
}
}