利用WM_GETTEXT消息获取谷歌浏览器地址栏内容。
2013-05-03 12:47
423 查看
所有要用到的API
WM_GETTEXT消息常量:
由于每打开一个网页谷歌浏览器的标题就会发生一次变化所以,我们不能用FindWindow来获取谷歌浏览器的句柄。
这里我使用了EnumWindows这个API,具体请自行百度。
声明一个委托(回调函数)
定义委托内容:
这里的_url用来存放地址栏的地址,其中2083是url地址有效长度。通过枚举所有顶层窗口,并通过标题判断,获取谷歌浏览器的句柄。其中hWnd参数表示当前枚举窗口的句柄。返回值为true则继续枚举,返回值为false则停止枚举。
完整代码:
这里的Chrome_OmniboxView是谷歌浏览器地址栏控件的所属类,通过spy++找到的。
窗口部分实现代码,通过定时器捕捉地址变化:
[DllImport("user32.dll")] public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll")] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] static extern int EnumWindows(EnumWindowsProc hWnd, IntPtr lParam); [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern int GetWindowText(IntPtr hWnd, StringBuilder lpText, int nCount); [DllImport("user32.dll")] private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
WM_GETTEXT消息常量:
private const int WM_GETTEXT = 0x00D;
由于每打开一个网页谷歌浏览器的标题就会发生一次变化所以,我们不能用FindWindow来获取谷歌浏览器的句柄。
这里我使用了EnumWindows这个API,具体请自行百度。
声明一个委托(回调函数)
delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
定义委托内容:
static bool FindChrom(IntPtr hWnd, IntPtr lParam) { //分配空间 var sb = new StringBuilder(256); GetWindowText(hWnd, sb, sb.Capacity); //注意某些窗口没有标题 if (sb.ToString() != String.Empty) { if ((sb.ToString().IndexOf("Google Chrome")) != -1) { if (hWnd != IntPtr.Zero) { IntPtr tb = FindWindowEx(hWnd, new IntPtr(0), "Chrome_OmniboxView", ""); StringBuilder strbld = new StringBuilder(2083); SendMessage(tb, WM_GETTEXT, 2083, strbld); _url = strbld.ToString(); } return false; } } //回调函数有返回值 return true; }
这里的_url用来存放地址栏的地址,其中2083是url地址有效长度。通过枚举所有顶层窗口,并通过标题判断,获取谷歌浏览器的句柄。其中hWnd参数表示当前枚举窗口的句柄。返回值为true则继续枚举,返回值为false则停止枚举。
完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace 禁止登陆指定网站
{
class WindowControlsText
{
//函数指针类型
delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("User32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
static extern int EnumWindows(EnumWindowsProc hWnd, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpText, int nCount);
[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, StringBuilder lParam);
private const int WM_GETTEXT = 0x00D;
private static string _url;
public string GetWindowText()
{
//IntPtr chrom = FindWindow("Chrome_WidgetWin_1", "百度一下,你就知道 - Google Chrome");
IntPtr chrom=IntPtr.Zero;
EnumWindowsProc enwdproc=new EnumWindowsProc(FindChrom);
if (EnumWindows(enwdproc, IntPtr.Zero) >= 0)
return _url;
else
return null;
}
static bool FindChrom(IntPtr hWnd, IntPtr lParam) { //分配空间 var sb = new StringBuilder(256); GetWindowText(hWnd, sb, sb.Capacity); //注意某些窗口没有标题 if (sb.ToString() != String.Empty) { if ((sb.ToString().IndexOf("Google Chrome")) != -1) { if (hWnd != IntPtr.Zero) { IntPtr tb = FindWindowEx(hWnd, new IntPtr(0), "Chrome_OmniboxView", ""); StringBuilder strbld = new StringBuilder(2083); SendMessage(tb, WM_GETTEXT, 2083, strbld); _url = strbld.ToString(); } return false; } } //回调函数有返回值 return true; }
}
}
这里的Chrome_OmniboxView是谷歌浏览器地址栏控件的所属类,通过spy++找到的。
窗口部分实现代码,通过定时器捕捉地址变化:
DispatcherTimer timer2 = new DispatcherTimer(); private void Button_Click_2(object sender, RoutedEventArgs e) { timer2.Interval = TimeSpan.FromMilliseconds(500); //获取或设置计时器刻度之间的时间段。 timer2.Tick += timer_Tick2; //超过计时器间隔时发生。 timer2.Start(); } private void timer_Tick2(object sender, object e) { WindowControlsText wct = new WindowControlsText(); string url = wct.GetWindowText(); tbUrl.Text = url; }
相关文章推荐
- Windows程序设计零基础自学_3_Windows程序的显示和更新_之获取设备内容句柄_非WM_PAINT消息期间绘制显示区域
- Flex中利用ExternalInterface API从JavaScript中获取内容并在Flex应用中使用的例子
- 利用webBrowser获取框架内Html页面内容
- 利用HttpWebRequest获取网页内容,由于Gzip压缩导致乱码的情况
- JAVA利用poi获取world文件内容
- Java基础:利用HttpClient获取网页内容
- 记录下利用spydroid获取SDP文件内容的点滴
- 利用ServerSocket获取浏览器http协议内容
- Flex中如何利用getTextField事件和numLines属性,计算出TextArea控件中内容的行数的例子
- [Java] 利用xpdf库获取pdf文件的指定范围文本内容
- [原创]利用地址栏获取页面脚本代码
- 利用Notify Server实现WEB页面实时获取通知消息
- php利用simple_html_dom类,获取页面内容,充当爬虫角色
- 对于屏蔽wm_gettext消息的思考
- apache cxf interceptor如何获取消息的详细内容
- 利用webBrowser获取页面iframe中的内容
- 进程之间通过CWnd::SendMessage(WM_COPYDATA,*,*)发送和获取消息
- [Java] 利用xpdf库获取pdf文件的指定范围文本内容
- C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
- 利用WM_CTLCOLOR消息实现编辑控制(Edit Control)的文本与背景色的改变