zoukankan      html  css  js  c++  java
  • 一体广告机实现思路,非常实用(二)

           继续昨天未完成的工作,昨天主要介绍了一体机开发的主要功能(一体广告机实现思路,非常实用(一)),今天主要介绍实现逻辑(代码层面)。也许有些人会认为实现起来很简答,也许不会的人可能比登天还难,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             //--加载FLASH
    13             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");//用户ID
    21             }
    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);//--休眠5S
    23             }
    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"));//地区
                    placeStr = xe.GetAttribute("Airport");//机场
                    airportPlaceStr = xe.GetAttribute("AirportPlace");//机场位置
                    userIDStr = xe.GetAttribute("UserID");//用户ID
                    versionStr = Convert.ToInt32(xe.GetAttribute("Version"));//版本号
                }
                //--********************************************************************************************
                //--图片下载
                if (DownImage() == false) { return; };
                //--********************************************************************************************
                //--文件下载
                if (DownFile() == false) { return; };
            }
            #endregion

    图片的下载,webservice接口由Java实现的,C#程序直接调用接口程序即可:

            #region * 图片下载
            /// <summary>
            /// 图片下载
            /// </summary>
            protected virtual Boolean DownImage()
            {
                //--**************************************************************************************************************************************
                //--第二步从webservice下载广告数据
                string xStr = "";
                try
                {
                    xStr = ws.getAdvertisList(areaStr, placeStr);
                }
                catch (Exception)
                {
                    MessageBox.Show("读取远程数据失败!");
                    return false;
                }
                //--***************************************************************************************************************************************
                //--String类型XML转成XML文档
                XmlDocument doc = new XmlDocument();
                try
                {
                    doc.LoadXml(xStr);//加载XML文档
                }
                catch (Exception xEr)
                {
                    MessageBox.Show(xEr.Message);
                    return false;
                }
                string xmlPath = "";
                xmlPath = Application.StartupPath + @"ADXml.xml";//保存XML的路径
                //检测XML文件是否已存在  
                if (File.Exists(xmlPath))
                {
                    File.Delete(xmlPath);//删除该文件 
                    doc.Save(xmlPath);//保存XML文件
                }
                else
                {
                    doc.Save(xmlPath);//保存XML文件
                }
                //--**************************************************************************************************************************************
                //--根据下载的广告XML数据重新生成一个新的XML文档,新XML文档即用于FLASH的加载图片所用
                if (File.Exists(xmlPath))
                {
                    //--把广告XML文档数据写入临时Datatable1中
                    xDataTable1.Clear();
                    //--
                    xmldoc.Load(xmlPath);//加载本地XML文件
                    XmlNodeList nodeList = xmldoc.SelectSingleNode("ADRoot").ChildNodes;//获取ADRoot节点的所有子节点
                    foreach (XmlNode xn in nodeList)//遍历所有子节点
                    {
                        XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
                        DataRow xDataRow1 = xDataTable1.NewRow();
                        xDataRow1[0] = xe.GetAttribute("name");
                        xDataRow1[1] = CompanyUrl + xe.GetAttribute("imgLink");//--加入链接地址,即为图片下载地址
                        xDataRow1[2] = xe.GetAttribute("url");
                        xDataRow1[3] = xe.GetAttribute("area");
                        xDataRow1[4] = xe.GetAttribute("place");
                        xDataTable1.Rows.Add(xDataRow1);
                    }
                }
                else
                {
                    MessageBox.Show("广告数据并未存在,请联系管理员!");
                    return false;
                }
                //--**************************************************************************************************************************************
                //--下载图片
                if (xDataTable1 != null)
                {
                    for (int i = 0; i < xDataTable1.Rows.Count; i++)//循环下载图片
                    {
                        //--
                        string ImagePath = "";
                        ImagePath = Application.StartupPath + @"Flashswf" + xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG";//检测图片是否已经存在
                        //检测图片文件是否已存在,如果已经存在不再进行下载,不存在则进行下载  
                        if (!File.Exists(ImagePath))//检测文件是否存在
                        {
                            DownloadImage(xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG", xDataTable1.Rows[i]["imgLink"].ToString().Trim());//调用数据下载方法
                        }
                        else
                        {
                            //如果图片文件已经存在,则不进行处理,自动跳过
                        }
                    }
                }
                //--***************************************************************************************************************************************
                //--生成FLASH加载图片的XML文件
                xmldoc = new XmlDocument();
                //--加入XML生命段落
                XmlDeclaration xmldecl;
                xmldecl = xmldoc.CreateXmlDeclaration("1.0", "GB2312", null);//创建XML的头元素
                xmldoc.AppendChild(xmldecl);//添加元素
                //--加入一个根元素
                xmlelem = xmldoc.CreateElement("", "imgList", "");
                xmldoc.AppendChild(xmlelem);
                //--
                if (xDataTable1 != null)
                {
                    //--循环DataTable写入XML文档中,用于FLASH的加载
                    for (int i = 0; i < xDataTable1.Rows.Count; i++)
                    {
                        //--在根节点中添加元素
                        XmlNode root = xmldoc.SelectSingleNode("imgList");
                        XmlElement xe1 = xmldoc.CreateElement("list");
                        xe1.SetAttribute("path", Application.StartupPath + @"Flashswf" + xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG");//FLASH加载图片地址
                        xe1.SetAttribute("info", "");//FLASH图片显示的描述,现不需要,暂时为空
                        xe1.InnerText = xDataTable1.Rows[i]["url"].ToString().Trim();//点击FLASH跳转的网站
                        root.AppendChild(xe1);
                    }
                }
                xmldoc.Save(Application.StartupPath.ToString() + @"\Flash\imgList.xml");//FLASH加载的XML
                //--图片下载完成
                return true;
            }
            #endregion
    
            #region * 图片下载操作方法
            /// <summary>
            /// 图片下载操作方法
            /// </summary>
            /// <param name="FileName">图片名字</param>
            /// <param name="Url">图片下载地址</param>
            public virtual void DownloadImage(string FileName, string Url)
            {
                WebRequest request = WebRequest.Create(Url);
                WebResponse response = request.GetResponse();
                Stream reader = response.GetResponseStream();
                string FilePath = Application.StartupPath + @"//Flash//swf";//存放图片的文件夹
                //--检测文件夹是否存在
                if (!Directory.Exists(FilePath))
                {
                    //如果不存在就创建该文件夹
                    Directory.CreateDirectory(FilePath);
                }
                FileStream writer = new FileStream(FilePath + @"//" + FileName, FileMode.OpenOrCreate, FileAccess.Write);
                byte[] buff = new byte[5120];//--5M的图片
                int c = 0;
                //实际读取的字节数
                while ((c = reader.Read(buff, 0, buff.Length)) > 0)
                {
                    writer.Write(buff, 0, c);
                }
                writer.Close();
                writer.Dispose();
                reader.Close();
                reader.Dispose();
                response.Close();
            }
            #endregion

    以上可能显示比较多的是对XML的读写操作而已,相对而言比较简单。

    文件下载的实现逻辑:

            #region * 文件下载
            /// <summary>
            /// 文件下载
            /// </summary>
            protected virtual Boolean DownFile()
            {
                //--**************************************************************************************************************************************
                //--第一步从webservice下载更新程序
                string xFileStr = "";//定义下载文件的路径
                try
                {
                    xFileStr = ws.getUpdatePack(versionStr);//从webservice读取下载信息
                }
                catch(Exception)
                {
                    MessageBox.Show("读取远程数据失败!");
                    return false;
                }
                string xFileSavePath = "";//定义保存文件的路径
                xFileSavePath = Application.StartupPath + @"\YTJ.exe";
                if (xFileStr != null)//--需更新文件
                {
                    string xFileDowmLoadPath = CompanyUrl + xFileStr;//下载文件的路径
                    if (File.Exists(xFileSavePath))//检测文件是否存在,如果存在则删除
                    {
                       //先杀死进程中的文件
                        System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
                        foreach (System.Diagnostics.Process p in ps)
                        {
                            if (p.ProcessName.ToLower() == "ytj")
                            {
                                p.Kill();//杀死进程
                                break;
                            }
                        }
                        //--
                        Thread.Sleep(2000);//--休眠2秒
                        File.Delete(xFileSavePath);//--删除文件
                        //--
                        DownloadFile(xFileSavePath, xFileDowmLoadPath);//文件下载
                        UpdateVersion();//版本号的更新
                        //--
    } else//不存在直接创建 { DownloadFile(xFileSavePath, xFileDowmLoadPath);//文件下载 UpdateVersion();//版本号的更新 } } else { //--如果文件的版本号相同,则不需要进行下载操作 //--不需要更新文件,可直接打开应用程序 } //启动程序 //启动应用程序之前先杀死进程中的文件,防止程序多次打开 System.Diagnostics.Process[] pss = System.Diagnostics.Process.GetProcesses(); foreach (System.Diagnostics.Process p in pss) { if (p.ProcessName.ToLower() == "ytj") { p.Kill(); break; } } System.Diagnostics.Process.Start("YTJ.exe"); //启动程序 this.Close();//--关闭升级程序 this.Dispose(); //-- //--**************************************************************************************************************************************** //--文件更新完成 return true; } /// <summary> /// 版本号的更新 /// </summary> protected virtual void UpdateVersion() { //--文件更新后,配置文件XML文档中的版本号增加"1"。 //--修改版本号 //--从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类型 xe.SetAttribute("Version", Convert.ToString((versionStr + 1)));//修改版本号,并增加1 } xmldoc.Save(autPath);//保存XML文件 } #endregion

    文件下载操作方法

            #region * 文件下载操作方法
            /// <summary>
            /// 文件下载操作方法
            /// </summary>
            /// <param name="FileName">文件名</param>
            /// <param name="Url">文件下载地址</param>
            public virtual void DownloadFile(string xFile, string Url)
            {
                WebRequest request = WebRequest.Create(Url);
                WebResponse response = request.GetResponse();
                Stream reader = response.GetResponseStream();
                FileStream writer = new FileStream(xFile, FileMode.OpenOrCreate, FileAccess.Write);
                byte[] buff = new byte[10240];//--10M的文件
                int c = 0;
                //实际读取的字节数
                while ((c = reader.Read(buff, 0, buff.Length)) > 0)
                {
                    writer.Write(buff, 0, c);
                }
                writer.Close();
                writer.Dispose();
                reader.Close();
                reader.Dispose();
                response.Close();
            }
            #endregion

           通过以上的介绍,也许很多人会觉得这实现起来非常简单,一些相对简单的代码即可实现了,不过你有没有好好想想,怎么实现动态的图片显示在flash里面,并且一点击flash图片调转到相应的网站,这又是怎么实现的,这也许就是实现一体广告机的关键之处,当年我在做这个地方可是花费了很多时间,查阅了很多资料才知道,flash还可以编程,这其中就是通过这个实现的,不知你能否想得到,如果你能想得到那证明你就是高手了,O(∩_∩)O哈哈~不知道的话希望今天看了我的博文能在你以后的工作中的使用到,也许这只是其中一种实现方法,也许你有更好的方法,如有希望你能够提供给我,大家一起学习进步。

           首先是通过程序的下载,会将相应的信息写入到XML中,XML文件如下:

    <?xml version="1.0" encoding="GB2312"?>
    <imgList>
      <list path="D:javaC#YTJ$DLLFlashswf终端7.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswf终10.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswf终端9.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswf终端4.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswf终端5.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswf终端6.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswfg02.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswfg03.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
      <list path="D:javaC#YTJ$DLLFlashswf	est.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
    </imgList>

           为了显得不是打广告,所有的链接都进行了替换,还有就是图片的路径是绝对路径,好像这里不能用相对路径,这好像是flash的原因,使用了绝对路径就显示不出图片了。

           由于现在电脑未安装flash编辑工具,所以就不能贴上flash相应的实现代码了,后续等我能打开flash的文件后再将实现代码贴出来,一起和大家交流学习,请大家关注,不好意思了。

  • 相关阅读:
    DVWA的安装及报错解决
    隐写工具F5-steganography的使用
    python skimage库的安装
    密码学笔记——zip明文攻击
    密码学笔记-一段base64wp
    kali中网卡、ssh、apache的配置与开启
    密码学笔记——希尔密码
    密码学笔记——playfair密码
    使用electron-packager electron-builder electron-updater 打包vue项目,支持在线更新
    搭建vue脚手架,包含Axios、qs、Element-UI、mock等插件的安装配置
  • 原文地址:https://www.cnblogs.com/luoyuhao/p/4206879.html
Copyright © 2011-2022 走看看