Windows CDhtmlDialog:如何从iframe捕获事件?
我有一个对话框,里面有一个iframe。我可以通过DHTML_event_onClick宏从顶级HTML中的按钮捕获onClick事件。但是相同的方法不适用于iframe中按钮的事件。有没有从iframe捕获事件的方法Windows CDhtmlDialog:如何从iframe捕获事件?,windows,mfc,webbrowser-control,Windows,Mfc,Webbrowser Control,我有一个对话框,里面有一个iframe。我可以通过DHTML_event_onClick宏从顶级HTML中的按钮捕获onClick事件。但是相同的方法不适用于iframe中按钮的事件。有没有从iframe捕获事件的方法 (顺便说一句,这两个页面都来自资源,它们没有跨域策略问题。)我不知道有什么合适的解决方案 我能想到的唯一方法是使用会话id和事件/参数数据从iframe ping web端点,并使用应用程序中的会话id轮询该服务 我正在考虑在应用程序中托管一个本地web服务器来实现这一点 编辑我
(顺便说一句,这两个页面都来自资源,它们没有跨域策略问题。)我不知道有什么合适的解决方案 我能想到的唯一方法是使用会话id和事件/参数数据从iframe ping web端点,并使用应用程序中的会话id轮询该服务 我正在考虑在应用程序中托管一个本地web服务器来实现这一点 编辑我的实现 我发现的解决方法是让iFrame生成一个假网络请求,并将属性数据作为url参数附加。然后,我在一个线程上侦听本地DNS缓存,以获取对伪域的请求,并提取名称值参数 以下是读取DNS缓存的代码段:
UINT CIFrameListener::ListenerThread(LPVOID pParam)
{
THREADPARAM* ts = (THREADPARAM*)pParam;
Util util;
long startScanTime = util.TimeMS();
HINSTANCE dnsApiLib = LoadLibraryA("DNSAPI.dll");
DNS_GET_CACHE_DATA_TABLE dnsGetCacheDataTable = nullptr;
if(dnsApiLib != nullptr) {
dnsGetCacheDataTable = (DNS_GET_CACHE_DATA_TABLE)GetProcAddress(dnsApiLib, "DnsGetCacheDataTable");
}
while(ts->_this->m_running){
int dnsIndex = 0;
// Check DNS
DNSCACHEENTRY entry;
PDNSCACHEENTRY pEntry = &entry;
dnsGetCacheDataTable(pEntry);
pEntry = pEntry->pNext;
while(pEntry != nullptr) {
size_t len = wcslen(pEntry->pszName);
CString domain(pEntry->pszName);
bool allreadyProcessed = false;
for (int i=0; i<ts->_this->messagesSent.size(); i++){
if( domain.Compare(ts->_this->messagesSent[i]) == 0){
allreadyProcessed = true;
}
}
ts->_this->messagesSent.push_back(domain);
if(allreadyProcessed == false){
int end = domain.Find(_T(".infocache.fakedomain.com"));
if(end != -1){
TRACE2(" Domain: %s %d \n", domain, dnsIndex);
int pos = domain.ReverseFind('-');
if(pos != -1){
CString token3 = domain.Mid(pos + 1, end - pos - 1);
domain = domain.Mid(0, pos);
pos = domain.ReverseFind('-');
if(pos != -1){
CString token2 = domain.Mid(pos + 1, domain.GetLength() - pos - 1);
domain = domain.Mid(0, pos);
pos = domain.ReverseFind('-');
if(pos != -1){
CString token1 = domain.Mid(pos + 1, domain.GetLength() - pos - 1);
CString token0 = domain.Mid(0, pos);
int comp = ts->_this->m_session.Compare(token0);
if(comp == 0){
// Notify handler there is a new event.
// notify(token2, token3, token0);
}
}
}
}
dnsIndex++;
}
}
pEntry = pEntry->pNext;
}
Sleep(250);
}
return 1;
}
UINT CIFrameListener::ListenerThread(LPVOID pParam)
{
THREADPARAM*ts=(THREADPARAM*)pParam;
Util-Util;
long startScanTime=util.TimeMS();
HINSTANCE dnsApiLib=LoadLibraryA(“DNSAPI.dll”);
DNS_GET_CACHE_DATA_TABLE dnsGetCacheDataTable=nullptr;
if(dnsApiLib!=nullptr){
dnsGetCacheDataTable=(DNS_GET_CACHE_DATA_TABLE)GetProcAddress(dnsApiLib,“dnsGetCacheDataTable”);
}
当(ts->\u此->m\u运行时){
int-dnsIndex=0;
//检查DNS
DNSCachentry入口;
PDNSCACHEENTRY pEntry=&entry;
dnsGetCacheDataTable(pEntry);
pEntry=pEntry->pNext;
while(pEntry!=nullptr){
尺寸长度=wcslen(pEntry->pszName);
CString域(pEntry->pszName);
bool allreadyProcessed=false;
对于(inti=0;i_this->messagesSent.size();i++){
if(domain.Compare(ts->u this->messagesSent[i])==0){
allreadyProcessed=true;
}
}
ts->\u此->消息发送。推回(域);
if(allreadyProcessed==false){
int end=domain.Find(_T(“.infocache.fakedomain.com”);
如果(结束!=-1){
TRACE2(“域:%s%d\n”,域,dnsIndex);
int pos=domain.ReverseFind('-');
如果(位置!=-1){
CString-token3=domain.Mid(pos+1,end-pos-1);
domain=domain.Mid(0,pos);
pos=域反转find('-');
如果(位置!=-1){
CString token2=domain.Mid(pos+1,domain.GetLength()-pos-1);
domain=domain.Mid(0,pos);
pos=域反转find('-');
如果(位置!=-1){
CString token1=domain.Mid(pos+1,domain.GetLength()-pos-1);
CString-token0=domain.Mid(0,pos);
int comp=ts->\u此->m\u会话。比较(令牌0);
如果(comp==0){
//通知处理程序有新事件。
//通知(令牌2、令牌3、令牌0);
}
}
}
}
dnsIndex++;
}
}
pEntry=pEntry->pNext;
}
睡眠(250);
}
返回1;
}