Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows CDhtmlDialog:如何从iframe捕获事件?_Windows_Mfc_Webbrowser Control - Fatal编程技术网

Windows CDhtmlDialog:如何从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服务器来实现这一点 编辑我

我有一个对话框,里面有一个iframe。我可以通过DHTML_event_onClick宏从顶级HTML中的按钮捕获onClick事件。但是相同的方法不适用于iframe中按钮的事件。有没有从iframe捕获事件的方法


(顺便说一句,这两个页面都来自资源,它们没有跨域策略问题。)

我不知道有什么合适的解决方案

我能想到的唯一方法是使用会话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; }