0

iframe を含む CHtmlDialog があります。DHTML_EVENT_ONCLICK マクロを使用して、最上位の HTML に配置されたボタンから onClick イベントをキャプチャできます。しかし、同じ方法は、iframe に配置されたボタンからのイベントでは機能しません。iframe からイベントをキャプチャする方法はありますか?

(ちなみに、どちらのページもリソースから来ており、クロスドメイン ポリシーの問題はありません。)

4

1 に答える 1

-2

これに対する適切な解決策がわかりません。

これを機能させるために考えられる唯一の方法は、セッション ID とイベント/パラメーター データを使用して iframe から Web エンドポイントに ping を実行し、アプリからのセッション ID を使用してそのサービスをポーリングすることです。

これを容易にするために、アプリ内でローカル Web サーバーをホストすることを検討しています。

編集 - 私の実装。

私が見つけた回避策は、属性データを URL パラメーターとして添付して、iFrame に偽のネットワーク リクエストを作成させることでした。次に、偽のドメインへのリクエストをローカル 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;
}
于 2014-02-27T22:39:25.320 に答える