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();//得到那个按钮然后写事件
处理一下点击,当然还要显示出验证码,手工填写.