c# 开发 ActiveX,用 JS 怎么捕获事件

liyiyong1689 2011-09-01 09:42:30
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);
}

}

...全文
255 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wb_lj 2011-12-08
  • 打赏
  • 举报
回复
怎么解决的 a
liyiyong1689 2011-09-01
  • 打赏
  • 举报
回复
大家可以出来帮帮忙吗,急死人了。
liyiyong1689 2011-09-01
  • 打赏
  • 举报
回复
终于解决了,研究了 3 天啊。。
liyiyong1689 2011-09-01
  • 打赏
  • 举报
回复
没有人会吗?还是我描述不清楚啊?
liyiyong1689 2011-09-01
  • 打赏
  • 举报
回复
这个问题已经困扰3天了,这个是我所有的分了,希望大家能帮小弟解决。一直在线等。
mleader1 2011-09-01
  • 打赏
  • 举报
回复
我也遇到一样问题 郁闷中啊

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧