这个网页
http://act.vip.qq.com/game/webgame/index.html?ADUIN=85809719&ADSESSION=1282959104&ADTAG=CLIENT.QQ.3007_.0#不知道哪位高手知道执行这个页面下的兑换是执行了什么函数阿?我想写个c#程序一直执行这个兑换,人工点不够快被抢光了。
我用invokemember("click")但是没用,分析数据包麻烦,想问问怎么用c#来写模拟点击兑换按钮的程序

解决方案 »

  1.   

    以下是与IE浏览器通信的类,调用系统API,查找窗口,获取IHTMLDocument对象(相当于网页中的document对象),其它操作可通过javascript实现. 添加MSHTML引用
    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);
    }
    示例代码IHTMLDocument2 doc = Win32API.GetHtmlDocument("IE窗口标题");
    doc.parentWindow.execScript("要点击的按钮.click()", "javascript");
      

  2.   

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

  3.   

    我就是想知道如何处理点击,楼上的2位讲的还不是很清楚,另外doc.parentWindow.execScript("要点击的按钮.click()", "javascript");
    这个 要点击的按钮.click()能这样写吗?按钮没有名字的啊,获得的id也是引用,难道能变成字符串?