首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#处理网页事件解决思路

2012-03-21 
C#处理网页事件这个网页http://act.vip.qq.com/game/webgame/index.html?ADUIN85809719&ADSESSION128295

C#处理网页事件
这个网页
http://act.vip.qq.com/game/webgame/index.html?ADUIN=85809719&ADSESSION=1282959104&ADTAG=CLIENT.QQ.3007_.0#

不知道哪位高手知道执行这个页面下的兑换是执行了什么函数阿?我想写个c#程序一直执行这个兑换,人工点不够快被抢光了。
我用invokemember("click")但是没用,分析数据包麻烦,想问问怎么用c#来写模拟点击兑换按钮的程序

[解决办法]
以下是与IE浏览器通信的类,调用系统API,查找窗口,获取IHTMLDocument对象(相当于网页中的document对象),其它操作可通过javascript实现. 添加MSHTML引用

C# code
using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using mshtml;namespace HwndTest{    public static class Win32API    {        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]        static extern uint RegisterWindowMessage(string lpString);        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]        static extern IntPtr SendMessageTimeout(            IntPtr hWnd,            uint Msg,            UIntPtr wParam,            IntPtr lParam,            SendMessageTimeoutFlags fuFlags,            uint uTimeout,            out UIntPtr lpdwResult);        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]        public static extern IntPtr SendMessageTimeout(            IntPtr windowHandle,            uint Msg,            IntPtr wParam,            IntPtr lParam,            SendMessageTimeoutFlags flags,            uint timeout,            out IntPtr result);        [DllImport("oleacc.dll", PreserveSig = false)]        [return: MarshalAs(UnmanagedType.Interface)]        static extern object ObjectFromLresult(UIntPtr lResult,             [MarshalAs(UnmanagedType.LPStruct)] Guid refiid, IntPtr wParam);        [DllImport("oleacc.dll", PreserveSig = false)]        [return: MarshalAs(UnmanagedType.Interface)]        static extern object ObjectFromLresult(IntPtr lResult,             [MarshalAs(UnmanagedType.LPStruct)] Guid refiid, IntPtr wParam);        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]        static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);        /// <summary>        /// 根据类名称和窗口名称查找窗口        /// </summary>        /// <param name="lpClassName">窗口类名称</param>        /// <param name="lpWindowName">窗口标题名称</param>        /// <returns>窗口句柄</returns>        [DllImport("user32.dll", SetLastError = true)]        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);        /// <summary>        /// 根据标题查找窗口,第一个参数必须为IntPtr.Zero        /// </summary>        /// <param name="ZeroOnly">必须为空</param>        /// <param name="lpWindowName">窗口标题名称</param>        /// <returns>窗口句柄</returns>        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);        [DllImport("user32.dll", SetLastError = true)]        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);        [DllImport("user32.dll", SetLastError = true)]        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]        static extern int GetWindowTextLength(IntPtr hWnd);        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);        [DllImport("user32.dll")]        [return: MarshalAs(UnmanagedType.Bool)]        static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);        [DllImport("user32.dll")]        [return: MarshalAs(UnmanagedType.Bool)]        private static extern bool EnumWindows(EnumWindowsProc1 lpEnumFunc, ref SearchData data);        [DllImport("user32.dll")]        [return: MarshalAs(UnmanagedType.Bool)]        private static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, ref IntPtr lParam);        [DllImport("user32.dll")]        [return: MarshalAs(UnmanagedType.Bool)]        static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);        [DllImport("user32.dll")]        [return: MarshalAs(UnmanagedType.Bool)]        static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, ref IntPtr lParam);        /// <summary>        /// 获取第一个IE窗口        /// </summary>        /// <returns>窗口句柄</returns>        public static IntPtr FindIEWindow()        {            return FindWindow("IEFrame", null);        }        /// <summary>        /// 获取IE窗口        /// </summary>        /// <param name="title">窗口标题</param>        /// <returns>窗口句柄</returns>        public static IntPtr FindIEWindow(string title)        {            return FindWindow("IEFrame", title);        }        /// <summary>        /// 根据标题获取窗口        /// </summary>        /// <param name="caption">标题</param>        /// <returns>指定标题的窗口句柄</returns>        public static IntPtr SearchForWindow(string caption)        {            return SearchForWindow(null, caption);        }        /// <summary>        /// 根据标题获取窗口        /// </summary>        /// <param name="wndClass">窗口类名称</param>        /// <param name="caption">标题</param>        /// <returns>指定标题的窗口句柄</returns>        public static IntPtr SearchForWindow(string wndClass, string caption)        {            SearchData sd = new SearchData();            sd.hWnd = IntPtr.Zero;            sd.wndClass = wndClass;            sd.title = caption;            EnumWindows(EnumProc, ref sd);            return sd.hWnd;        }        private static bool EnumProc(IntPtr hWnd, ref SearchData data)        {            StringBuilder sb;            if (data.wndClass != null)            {                sb = new StringBuilder(1024);                GetClassName(hWnd, sb, sb.Capacity);                if (!sb.ToString().StartsWith(data.wndClass))                    return true;            }            if (data.title != null)            {                sb = new StringBuilder(1024);                GetWindowText(hWnd, sb, sb.Capacity);                if (!sb.ToString().StartsWith(data.title))                    return true;            }            data.hWnd = hWnd;            return false;        }        public class SearchData        {            public string wndClass;            public string title;            public IntPtr hWnd;        }        private delegate bool EnumWindowsProc1(IntPtr hWnd, ref SearchData data);        /// <summary>        /// 获取HTML控件窗口        /// </summary>        /// <param name="hWnd">窗口标题</param>        /// <returns>HTML控件窗口句柄</returns>        public static IntPtr SearchForHtmlWindow(IntPtr hWnd)        {            IntPtr hWndChild = IntPtr.Zero;            EnumChildWindows(hWnd, new HwndTest.EnumWindowsProc(EnumChildProc), ref hWndChild);            return hWndChild;        }        private static bool EnumChildProc(IntPtr hWnd, ref IntPtr lParam)        {            StringBuilder sb = new StringBuilder(1024);            GetClassName(hWnd, sb, sb.Capacity);            if (sb.ToString() == "Internet Explorer_Server")            {                lParam = hWnd;                return false;            }            return true;        }        /// <summary>        /// 根据窗口标题获取HTML Document对象        /// </summary>        /// <param name="caption">窗口标题</param>        /// <returns>HTML Document对象</returns>        public static IHTMLDocument2 GetHtmlDocument(string caption)        {            IntPtr hWnd = SearchForWindow("IEFrame", caption);            if (hWnd.ToInt32() == 0) return null;            IntPtr hWndChild = SearchForHtmlWindow(hWnd);            uint uMsg = RegisterWindowMessage("WM_HTML_GETOBJECT");            IntPtr hRes;            SendMessageTimeout(hWndChild, uMsg, IntPtr.Zero, IntPtr.Zero, SendMessageTimeoutFlags.SMTO_ABORTIFHUNG, 1000, out hRes);            if (hRes.ToInt32() == 0) return null;            IHTMLDocument2 doc = ObjectFromLresult(hRes, typeof(IHTMLDocument2).GUID, IntPtr.Zero) as IHTMLDocument2;            return doc;        }    }    [Flags]    public enum SendMessageTimeoutFlags : uint    {        SMTO_NORMAL = 0x0,        SMTO_BLOCK = 0x1,        SMTO_ABORTIFHUNG = 0x2,        SMTO_NOTIMEOUTIFNOTHUNG = 0x8    }    public delegate bool EnumWindowsProc(IntPtr hWnd, ref IntPtr lParam);} 


[解决办法]
你用 WebBrowser 

HtmlDocument hb = wb.Document;
hb.GetElementById();//得到那个按钮然后写事件
处理一下点击,当然还要显示出验证码,手工填写.

热点排行