2013-06-17 2 views
0

나는 그 안에 iframe이있는 CHtmlDialog가 있습니다. DHTML_EVENT_ONCLICK 매크로를 사용하여 최상위 HTML에 배치 된 버튼에서 onClick 이벤트를 캡처 할 수 있습니다. 그러나 iframe에있는 버튼의 이벤트와 동일한 메소드가 작동하지 않습니다. iframe에서 이벤트를 캡처하는 방법이 있습니까?CDhtmlDialog : iframe에서 이벤트를 캡처하는 방법?

은 (그건 그렇고, 두 페이지는 자원에서 온 그들은 크로스 도메인 정책 문제가 없습니다.)

답변

-2

내가 이것에 대한 적절한 해결책을 알고하지 않습니다.

이 방법을 사용할 수있는 유일한 방법은 이벤트/매개 변수 데이터와 함께 세션 ID를 사용하여 iframe에서 웹 끝점을 핑 (ping)하고 응용 프로그램의 세션 ID를 사용하여 해당 서비스를 폴링하는 것입니다.

나는 이것을 촉진하기 위해 응용 프로그램 내에서 로컬 웹 서버를 호스팅하고 있습니다.

편집 - 내 구현.

내가 발견 한 해결 방법은 iFrame이 URL 매개 변수로 첨부 된 속성 데이터로 가짜 네트워크 요청을하는 것입니다. 그런 다음 가짜 도메인에 대한 요청에 대한 로컬 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; 
} 
: 여기

는 DNS 캐시를 읽는 코드 조각입니다
관련 문제