似乎您正在尝试使用Adobe Flash作为界面,并将某些变量传回C#,以下是一个示例:
在Flash中创建一个按钮,Actionscript如下:
on (press) {
fscommand("Yo","dude");
}
然后在Visual Studio中,您只需要添加COM对象引用:Shockwave Flash Object。
接下来将嵌入设置为true;
然后在Visual Studio中,您应该能够进入属性;查找fscommand。 fscommand将允许您从Flash电影中实际连接值。
AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent
这段代码是用于收集信息的;然后只需使用e.command
和e.arg
来让收集到的内容执行某些操作。
接下来,将此代码添加到事件处理程序中即可。
lbl_Result.Text="The "+e.args.ToString()+" "+e.command.ToString()+" was clicked";
咔嚓一声,数据就从Flash传输到Visual Studio了,不需要使用任何麻烦复杂的套接字。
此外,如果你在Visual Studio中使用Flash,关键是确保其“embed”属性设置为true。这将保留Flash对象内部的所有路径引用,避免调用错误路径。
如果没有更多关于你的目标/错误的详细信息,我无法为你提供帮助,希望这些内容能对你有所帮助。前面的部分应该可以展示最佳的将Shockwave嵌入Visual Studio的方法。
请确保添加正确的引用:
- 在项目中打开“解决方案资源管理器”
- 右击选择“添加引用”
- 进入“COM对象”
找到正确的对象;
COM Objects:
Shockwave ActiveX
Flash Accessibility
Flash Broker
Shockwave Flash
希望这有所帮助。
听起来你没有正确地嵌入它,所以你不能调用它。如果我有些错误;或者这就是你的意思:
如果你有困难,Ryk之前发过一篇帖子,介绍了一种嵌入YouTube视频的方法:
<% MyYoutubeUtils.ShowEmebddedVideo("<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/gtNlQodFMi8&hl=en&fs=1"></param><param name="allowFullScreen" value="true"></param><embed src="http://www.youtube.com/v/gtNlQodFMi8&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>") %>
或者...
public static string ShowEmbeddedVideo(string youtubeObject)
{
var xdoc = XDocument.Parse(youtubeObject);
var returnObject = string.Format("<object type=\"{0}\" data=\{1}\"><param name=\"movie\" value=\"{1}\" />",
xdoc.Root.Element("embed").Attribute("type").Value,
xdoc.Root.Element("embed").Attribute("src").Value);
return returnObject;
}
您可以在此处找到该线程:
https://stackoverflow.com/questions/2547101/purify-embedding-youtube-videos-method-in-c-sharp
非常抱歉,如果我的帖子显得有些零散;但我无法确定是引用、变量、方法还是嵌入式造成了您的困难。真心希望这可以帮到您;或者请给我更多细节,我会相应地调整我的回答。
C# 到 ActionScript 的通信:
import flash.external.ExternalInterface;
ExternalInterface.addCallback("loadAndPlayVideo", null, loadAndPlayVideo);
function loadAndPlayVideo(uri:String):void
{
videoPlayer.contentPath = uri;
}
然后在C#中;添加ActiveX控件的实例,并将内容添加到构造函数中。
private AxShockwaveFlash flashPlayer;
public FLVPlayer ()
{
flashPlayer.LoadMovie(0, Application.StartupPath + "\\player.swf");
}
fileDialog = new OpenFileDialog();
fileDialog.Filter = "*.flv|*.flv";
fileDialog.Title = "Select a Flash Video File...";
fileDialog.Multiselect = false;
fileDialog.RestoreDirectory = true;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
flashPlayer.CallFunction("<invoke" + " name=\"loadAndPlayVideo\" returntype=\"xml"> <arguements><string>" + fileDialog.FileName + "</string></arguements></invoke>");
}
ActionScript与C#之间的通信:
import flash.external.ExternalInterface;
ExternalInterface.call("ResizePlayer", videoPlayer.metadata.width, videoPlayer.metadata.height);
flashPlayer.FlashCall += new _IShockwaveFlashEvents_FlashCallEventHandler(flashPlayer_FlashCall);
然后XML应该出现:
<invoke name="ResizePlayer" returntype="xml">
<arguements>
<number> 320 </number>
<number> 240 </number>
</arguments>
</invoke>
然后在事件处理程序中解析XML并在本地调用C#函数。
XmlDocument document = new XmlDocument();
document.LoadXML(e.request);
XmlNodeList list = document.GetElementsByTagName("arguements");
ResizePlayer(Convert.ToInt32(list[0].FirstChild.InnerText), Convert.ToInt32(list[0].ChildNodes[1].InnerText));
现在它们互相传递数据。这只是一个基本的例子,但通过使用ActionScript通信,您不应该有任何问题使用本机API。
希望这更有帮助。您可以通过为重复使用创建实用程序类来扩展该想法。显然,上面的代码有一些限制,但希望它能指引您朝着正确的方向前进。那是您试图去的方向吗?还是我仍然误解了您的意思?
在ActionScript 3中创建新的Flash动画。然后在初始第一帧上应用以下内容:
Security.allowDomain("www.youtube.com");
var my_player:Object;
var my_loader:Loader = new Loader();
my_loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"))
my_loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
function onLoaderInit(e:Event):void{
addChild(my_loader);
my_player = my_loader.content;
my_player.addEventListener("onReady", onPlayerReady);
}
function onPlayerReady(e:Event):void{
my_player.setSize(640,360);
my_player.loadVideoById("_OBlgSz8sSM",0);
}
那么这个脚本到底在做什么?它利用原生API并使用ActionScript通信。下面我将分解每一行。
Security.allowDomain("www.youtube.com");
没有这条线,YouTube将无法与该对象进行交互。
var my_player:Object;
你不能简单地把电影加载到电影中,因此我们将创建一个变量对象。您必须加载一个特殊的.swf文件,其中包含对这些代码的访问权限。以下内容实现了这一点。因此,您可以访问API。
var my_loader:Loader = new Loader()
my_loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3"));
我们现在按照谷歌API的文档进行引用。
my_loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit);
但是,为了实际使用我们的对象,我们需要等待它完全初始化。因此,事件监听器将等待,以便我们知道何时可以向其发送命令。
onLoaderInit
函数将在初始化时触发。然后它的第一个任务是使my_loader
显示列表,以便视频出现。
addChild(my_loader);
将加载一个,my_player = my_loader.content;
将存储一个引用,以便轻松访问该对象。
尽管它已经被初始化,您仍需要等待更久...... 使用my_player.addEventListener("onReady", onPlayerReady);
等待并监听这些自定义事件。这将允许稍后的函数来处理。
现在播放器已准备好进行基本配置。
function onPlayerReady(e:Event):void{
my_player.setSize(640,360);
}
上述函数开始进行基本操作。然后最后一行my_player.loadVideoById("_OBlgSz8sSM",0);
引用了特定的视频。
接下来,在您的舞台上,您可以创建两个按钮并应用:
play_btn.addEventListener(MouseEvent.CLICK, playVid);
function playVid(e:MouseEvent):void {
my_player.playVideo();
}
pause_btn.addEventListener(MouseEvent.CLICK, pauseVid);
function pauseVid(e:MouseEvent):void {
my_player.pauseVideo();
}
这将为您提供播放和暂停功能。您可以使用一些其他项目:
loadVideoById()
cueVideoById()
playVideo()
pauseVideo()
stopVideo()
mute()
unMute()
请记住在完全初始化之前,这些内容不能被使用或调用。但是使用此方法可以让您布局目标并在两者之间传递变量以进行操作。
希望这有所帮助。