win32获取浏览器当前Tab的URL
代码都是win10上测试的
1. 获取IE的URL,Enum IE窗口的子句柄,找到className为Edit的句柄,然后用SendMessage WM_GETTEXT消息来获取:
上代码:
#include <iostream>
#include <string>
#include <windows.h> BOOL CALLBACK BrowserIEChildEnumProc(HWND hwndChild, LPARAM lParam)
{
char className[] = { };
GetClassName(hwndChild, className, );
char url[] = { }; std::string class_name(className);
if (class_name.compare("Edit") == )
{ SendMessage(hwndChild, WM_GETTEXT, sizeof(url), (LPARAM)url); // 必须用SendMessage, 不然用GetWindowText会得不到,因为是远程进程
std::cout << "IE Level Edit class : URL" << url << std::endl;
}
else if (class_name.compare("ComboBoxEx32") == )
{
SendMessage(hwndChild, WM_GETTEXT, sizeof(url), (LPARAM)url);
std::cout << "ComboBoxEx32 class : URL" << url << std::endl; }
else if (class_name.compare("TabWindowClass") == )
{
SendMessage(hwndChild, WM_GETTEXT, sizeof(url), (LPARAM)url);
std::cout << "TabWindowClass class : URL" << url << std::endl;
}
else
{ } return TRUE;
} BOOL CALLBACK BrowserEnumProc(HWND hwndChild, LPARAM lParam)
{
char className[] = { }; GetClassName(hwndChild, className, ); std::string class_name(className);
//std::cout << "Window Class is:" << class_name << std::endl;
if (class_name.compare("IEFrame") == )
{
EnumChildWindows(hwndChild, BrowserIEChildEnumProc, NULL);
}
else if (class_name.compare("Edit") == )
{
char url[] = { };
SendMessage(hwndChild, WM_GETTEXT, sizeof(url), (LPARAM)url);
std::cout << "Top Level Edit class : URL" << url << std::endl;
}
//else if ()
//{ //} return TRUE;
} int main()
{
EnumChildWindows(NULL, BrowserEnumProc, NULL); int d;
std::cin >> d;
return ;
}
通过windows的动态数据交换(DDE)技术来获取FireFox浏览器的URL(不支持Opera 和Chrome):
#include <iostream>
#include <string>
#include <windows.h> #include <ddeml.h> HDDEDATA CALLBACK
DdeCallback(UINT uType, UINT uFmt, HCONV hconv,
HSZ hsz1, HSZ hsz2, HDDEDATA hdata,
DWORD dwData1, DWORD dwData2)
{
return ((HDDEDATA)NULL);
} //请求数据
void DDERequest(DWORD idInst, HCONV hConv, char* szItem, char* sDesc)
{
HSZ hszItem = DdeCreateStringHandle(idInst, szItem, ); //给szItem和sDesc赋值
HDDEDATA hData = DdeClientTransaction(NULL, , hConv, hszItem, CF_TEXT,
XTYP_REQUEST, , NULL); //5秒超时 if (hData == NULL)
{
//请求数据失败
printf("Request failed: %s\n", szItem);
}
else
{
//成功获取到数据
char szResult[];
DdeGetData(hData, (unsigned char *)szResult, , ); printf("Request Success: %s\n", szResult);
}
} static void fetchFireFoxURL(){ DWORD idDde = ;
HCONV HConversation;
HSZ Server = NULL;
HSZ Topic = NULL; DdeInitialize(&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, ); Server = DdeCreateStringHandle(idDde, "FireFox", CP_WINANSI);
Topic = DdeCreateStringHandle(idDde, "WWW_GetWindowInfo", CP_WINANSI); HConversation = DdeConnect(idDde, Server, Topic, NULL); if (HConversation == )
{
DdeUninitialize(idDde);
} char recvData[] = { };
//请求数据
DDERequest(idDde, HConversation, "\\Doc", recvData); //断开连接,释放资源
DdeDisconnect(HConversation);
DdeUninitialize(idDde); } int main()
{ fetchFireFoxURL(); int d;
std::cin >> d;
return ;
}
references:
https://github.com/heenbo/my_test_c/blob/140f546b72ca7027fbd135978f236f7946ad2822/15_emacs/emacs-25.1/nt/ddeclient.c
https://msdn.microsoft.com/en-us/library/windows/desktop/ms648774(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms648775(v=vs.85).aspx
https://autohotkey.com/board/topic/17633-retrieve-addressbar-of-firefox-through-dde-message/page-2
http://bbs.csdn.net/topics/360011960
http://www.delphitop.com/html/xitong/1763.html
https://answers.microsoft.com/en-us/windows/forum/windows_8-networking/get-safari-browser-url-in-windows-application/b793cdb8-415e-4d4a-94ab-c35e6ea08dd2
http://stackoverflow.com/questions/3579649/get-url-from-browser-to-c-sharp-application
http://stackoverflow.com/questions/5317642/retrieve-current-url-from-c-sharp-windows-forms-application/33191637#33191637
win32获取浏览器当前Tab的URL的更多相关文章
- 如何获取浏览器URL中查询字符串的参数
首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...
- JS获取浏览器URL中查询字符串的参数
首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...
- 如何获取浏览器URL中查询字符串的参数?
如何获取浏览器URL中查询字符串的参数? 想要知道怎样解决这个问题,首先我们先认识一下Location对象. Location对象包含了当前页面与位置(url)相关的信息 URL示例:http://w ...
- js获取浏览器上一访问页面URL地址,document.referrer方法
如题,可用document.referrer方法获取上一页面的url 但是也有不可使用的情况 直接在浏览器地址栏中输入地址: 使用location.reload()刷新(location.href或者 ...
- 如何用js获取浏览器URL中查询字符串的参数
首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...
- 三个获取浏览器URL中参数值的方法
这三个是一般的获取浏览器传的参数值的方法,之前有用unescape()解码的方法,但是遇到汉字会产生乱码,所以用decodeURI(); 方法一: function getQueryString(na ...
- 获取浏览器url参数
//获取浏览器url参数 var methods ={ getQueryString: function (name) { var reg = new RegExp('(^|&)' + nam ...
- 获取浏览器中url的参数
例如: 浏览器的地址是:http://localhost:8080/src/views/moneyDetail?id=10 vue 获取浏览器的参数 获取id的参数:this.$route.query ...
- 获取浏览器信息 c#
Request.Browser.MajorVersion.ToString();//获取客户端浏览器的版本号 Request.Browser.Version.ToString();//获取客户端浏览器 ...
随机推荐
- ASP.NET MVC:无法向会话状态服务器发出会话状态请求
ylbtech-Error-ASP.NET MVC: 无法向会话状态服务器发出会话状态请求 无法向会话状态服务器发出会话状态请求.请确保 ASP.NET State Service (ASP.NET ...
- QT TCP网络编程
首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议.相比而言UDP,就是开放式.无连接.不可靠的传输层 ...
- 《UNIX环境高级编程》笔记--环境变量
ISO C定义了一个函数getenv,可以用其取环境变量值. #include <stdlib.h> char* getenv(const char* name); //返回与name关联 ...
- 构建-4 dependencies 依赖管理
官方文档 Add build dependencies The Gradle build system in Android Studio makes it easy to include exter ...
- Python Numpy模块函数np.c_和np.r_
np.r_:是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat(). np.c_:是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的 ...
- PLSQL Developer连接远程Oracle数据库
要连接远程数据库,传统的一定可行的方法是在本地装一个oracle.然后使用"Network Configuration Assistant"配置.之后用PL/SQL Dev连接.由 ...
- [转]xshell实现端口转发
原文: https://www.cnblogs.com/linxizhifeng/p/8657795.html https://blog.csdn.net/qq_34039315/article/de ...
- 深浅拷贝 python
原文:http://www.jb51.net/article/15714.htm 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 ...
- [Spring Boot] Use Component Scan to scan for Bean
Component Scan is important concept when we want to create Bean. Currently we know what, for the cla ...
- CodeForces 569B Inventory 货物编号
原题: http://codeforces.com/contest/569/problem/B 题目: Inventory time limit per test1 second memory lim ...