首页 > 学院 > 开发设计 > 正文

一体广告机实现思路,非常实用(二)

2019-11-17 02:39:26
字体:
来源:转载
供稿:网友

一体广告机实现思路,非常实用(二)

继续昨天未完成的工作,昨天主要介绍了一体机开发的主要功能(一体广告机实现思路,非常实用(一)),今天主要介绍实现逻辑(代码层面)。也许有些人会认为实现起来很简答,也许不会的人可能比登天还难,O(∩_∩)O哈哈~,我就来简单介绍下。也许我说的方法不是最好的,希望你能提供更好的方法,大家一起学习交流了,共同进步。

我所使用的广告滚动使用的是Flash来实现,调用了VS的Interop.ShockwaveFlashObjects.dll文件,这个VS自带的。首先是屏蔽flash右键的实现代码(主要作用是单击右键不会出现其他菜单,否则就会出现点击右键有其他菜单显示,这肯定不符合广告的要求的,所以必须要屏蔽flash右键,实现逻辑也是调用钩子去屏蔽右键):

 1         #region * 屏蔽FLASH右键 2         //此段代码实现调用系统函数,来实现窗体 3         //加载flash时,可以屏蔽其右键 4         PRivate const int GWL_WNDPROC = -4; 5         public delegate IntPtr FlaWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); 6  7         private IntPtr OldWndProc = IntPtr.Zero; 8         private FlaWndProc Wpr = null; 9 10         [DllImport("user32.dll", CharSet = CharSet.Auto)]11         public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, FlaWndProc wndProc);12         [DllImport("user32.dll", CharSet = CharSet.Auto)]13         public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);14         //给此控件一个特定消息值15         private IntPtr FlashWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)16         {17             if (msg == 516)18                 return (IntPtr)0;19             return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);20         }21         #endregion

FormLoad加载flash,并设定程序的分辨率(更加广告机的分辨率去设定,这样避免程序显示不正确,因为要控制广告机除了播放滚动的图片之外,就是跳转相应的网站,而不允许进行桌面,否则别人就会做很多其他操作了,所以这点必须要控制的,而且图片的分辨率也是这样的,所以这样就这样就固定死程序的分辨率了),并且加载swf文件,并开始play,实现flash滚动,实现代码如下:

 1             this.Width = 1080; 2             this.Height = 1920; 3             this.Location = new Point(0, 0); 4             //-- 5             this.timer1.Enabled = true; 6             this.timer1.Interval = 100; 7             this.timer1.Start(); 8             //-- 9             //屏蔽右键10             this.Wpr = new FlaWndProc(this.FlashWndProc);11             this.OldWndProc = SetWindowLong(axShockwaveFlash1.Handle, GWL_WNDPROC, Wpr);12             //--加载FLASH13             this.axShockwaveFlash1.Movie = application.StartupPath + @"//Flash//apaperstudio.swf";14             axShockwaveFlash1.Play();     15             //-- 16             ReadUserInfo();//--读取用户信息17             //--18             LoadWeb();//--预加载网站

读取用户信息是xml文档,这样可以进行在现场进行配置,使用起来就比较方便。

 1         /// <summary> 2         /// 读取用户信息 3         /// </summary> 4         protected virtual void ReadUserInfo() 5         { 6             //--从autorun.xml文件中读取配置文件 7             string autPath = ""; 8             autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录 9             if (!File.Exists(autPath))//判断程序目录是否存在配置文件10             {11                 MessageBox.Show("配置文件不存在,请联系管理员!");12                 return;13             }14             XmlDocument xmldoc = new XmlDocument();15             xmldoc.Load(autPath);//加载XML文件16             XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点17             foreach (XmlNode xn in audList)//遍历所有子节点18             {19                 XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型20                 userIDStr = xe.GetAttribute("UserID");//用户ID21             }22         }

XML文件如下:

<?xml version="1.0" encoding="UTF-8"?><Root>  <Para TerminalID="1111" AreaID="85" Airport="福田" AirportPlace="A1" UserID="adminUserId" Version="14" /></Root>

预加载网站实现代码如下,这些数据都是通过升级程序下载到,并保存在本地,再供一体机程序调用:

 1         /// <summary> 2         /// 预加载网站 3         /// </summary> 4         protected virtual void LoadWeb() 5         { 6             //--从ADXml.xml文件中读取广告列表 7             string autPath = ""; 8             autPath = Application.StartupPath + @"//ADXml.xml";//广告列表目录 9             if (!File.Exists(autPath))//判断程序目录是否存在广告列表10             {11                 MessageBox.Show("广告列表不存在,请联系管理员!");12                 return;13             }14             XmlDocument xmldoc = new XmlDocument();15             xmldoc.Load(autPath);//加载XML文件16             XmlNodeList audList = xmldoc.SelectSingleNode("ADRoot").ChildNodes;//获取ADRoot节点的所有子节点17             foreach (XmlNode xn in audList)//遍历所有子节点18             {19                 XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型20                 string url = xe.GetAttribute("url");//预加载的网址21                 webBrowser1.Navigate(url);22                 System.Threading.Thread.Sleep(5000);//--休眠5S23             }24         }

广告XML文件:

<?xml version="1.0" encoding="UTF-8"?><ADRoot>  <AD name="终端7" imgLink="attachments/imgs/ad/201111/016965953952723834xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityIndex.do" area="85" place="福田" />  <AD name="终10" imgLink="attachments/imgs/ad/201111/066067356307548920xorg.jpg" url="www.darenbang.com/taoletao/front/bbase/productSearch.do?type=2&amp;Q_newProduct_SN_EQ=1" area="85" place="福田" />  <AD name="终端9" imgLink="attachments/imgs/ad/201111/012278613580213338xorg.jpg" url="www.darenbang.com/taoletao/front/index/channelsPage.do?categoryId=7" area="85" place="福田" />  <AD name="终端4" imgLink="attachments/imgs/ad/201111/052606357223467712xorg.jpg" url="www.darenbang.com" area="85" place="福田" />  <AD name="终端5" imgLink="attachments/imgs/ad/201111/023391954847731068xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityBuyer.do" area="85" place="福田" />  <AD name="终端6" imgLink="attachments/imgs/ad/201111/007393856959106082xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityFront.do" area="85" place="福田" /></ADRoot>

点击FLASH图片跳转网站,再通过连接打开相应的网站,这个在flash代码进行了定义,所以使用cmd命令就可以打开相应的网站,再根据链接跳转到相应的网站,打开的网站也之前在我们的程序中进行打开,使用的是webBrowser控件,这样就控制只能打开我们所指定的网站。

 1         #region * 点击FLASH图片跳转网站 2         private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e) 3         { 4             if (e.command == "cmd") 5             { 6                 WebForm xForm = new WebForm(e.args.ToString() + "?id=" + userIDStr);//设定跳转的网站+用户ID 7                 xForm.Show(); 8             } 9         }10         #endregion

程序启动时会调用Timer事件,启动程序升级,在相应的时间节点(可以设定多个时间检测是否需要升级)进行升级。

 1         #region * 启动升级程序 2         ArrayList AutoTask = new ArrayList(); 3         private void timer1_Tick(object sender, EventArgs e) 4         { 5             System.DateTime dtAuto = DateTime.Now; 6             AutoTask.Add("00:00:00"); 7  8             for (int n = 0; n < AutoTask.Count; n++) 9             {10                 if (dtAuto.ToLongTimeString().Equals(AutoTask[n]))11                 {12                     System.Diagnostics.Process.Start(Application.StartupPath + @"//AutoUpdater.exe");         //启动程序13                     this.Close();//--关闭升级程序14                     this.Dispose();15                 }16             }17         }18         #endregion

升级程序会做几件事情:

1. 通过Webservice下载一体机的程序,根据版本号比较决定是否需要升级。

2. 通过Webservice下载一体机的广告图片,这样在相应的网站后台对图片进行维护,将广告数据保存在本地的XML文件中,供程序读取XML文件。

通过WebService下载数据,程序或广告图片,实现逻辑如下:

        #region * 通过WebService下载数据        public virtual void DownloadWebServiceData()        {            //--绑定Webservice            ws = new AutoUpdater.WebService.AdvertisWebServicesService();            ws.Url = "http://www.fmafia.com/taoletao/AdvertisWebServices.jws?wsdl";            //--            //--从autorun.xml文件中读取配置文件            string autPath = "";            autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录            if (!File.Exists(autPath))//判断程序目录是否存在配置文件            {                MessageBox.Show("配置文件不存在,请联系管理员!");                return;            }            xmldoc.Load(autPath);//加载XML文件            XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点            foreach (XmlNode xn in audList)//遍历所有子节点            {                XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型                idStr = Convert.ToInt32(xe.GetAttribute("TerminalID"));//终端机ID                areaStr = Convert.ToInt32(xe.GetAttribute("AreaID
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表