程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 一體廣告機實現思路,非常實用(二),思路非常實用

一體廣告機實現思路,非常實用(二),思路非常實用

編輯:C#入門知識

一體廣告機實現思路,非常實用(二),思路非常實用


       繼續昨天未完成的工作,昨天主要介紹了一體機開發的主要功能(一體廣告機實現思路,非常實用(一)),今天主要介紹實現邏輯(代碼層面)。也許有些人會認為實現起來很簡答,也許不會的人可能比登天還難,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 + @"\Flash\swf\" + 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 + @"\Flash\swf\" + 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:\java\C#\YTJ\$DLL\Flash\swf\終端7.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\終10.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\終端9.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\終端4.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\終端5.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\終端6.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\g02.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\g03.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\test.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
</imgList>

       為了顯得不是打廣告,所有的鏈接都進行了替換,還有就是圖片的路徑是絕對路徑,好像這裡不能用相對路徑,這好像是flash的原因,使用了絕對路徑就顯示不出圖片了。

       由於現在電腦未安裝flash編輯工具,所以就不能貼上flash相應的實現代碼了,後續等我能打開flash的文件後再將實現代碼貼出來,一起和大家交流學習,請大家關注,不好意思了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved