TCppWebBrowser und Link unter Maus erkennen



  • Mit folgendem Code ermittel ich den Link unterhalb des Mauszeigers:

    AnsiString TAcDocHandler::getUrlUnderMouse(POINT mousePos) {
      AnsiString url = "";
      TCppWebBrowser *wbMain = browser;
      IHTMLDocument2 *pDoc = NULL;
      IHTMLElement *pElement = NULL;
      IHTMLAnchorElement *pAnchor = NULL;
      bool blUrl = false;
    
      try
      {
        if(wbMain->Document == NULL)
          return "";
    
        WideString wURL;
        POINT p = mousePos;
    
        if(SUCCEEDED(wbMain->Document->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc)))
        {
          if(pDoc == NULL)
            return "";
    
          //GetCursorPos(&p);
          p = wbMain->ScreenToClient(p);
          if(SUCCEEDED(pDoc->elementFromPoint(p.x, p.y, &pElement)))
          {
            if(pElement == NULL)
              return "";
    
            if(SUCCEEDED(pElement->QueryInterface(IID_IHTMLAnchorElement,(LPVOID*)&pAnchor)))
            {
    
              if(pAnchor == NULL)
                return "";
    
              if(SUCCEEDED(pAnchor->get_href(&wURL)))
              {
                blUrl = true;
                url = AnsiString(wURL);
              }
            }
          }
        }
      }
      __finally
      {
        if(!blUrl)
          url = "";
        if(pDoc != NULL)
          pDoc->Release();
        if(pElement != NULL)
          pElement->Release();
        if(pAnchor != NULL)
          pAnchor->Release();
        return url;
      }
    }
    

    Das klappt eigentlich auch immer, aber bei einigen Links leider nicht: Wenn man auf google.de nach sport sucht, wird als erstes Ergebnis ein Link auf sport.de ausgeworfen. Wenn ich die Maus über diesem Link habe und dann den Link unter der Maus ermitteln will, schlägt die Zeile

    if(SUCCEEDED(wbMain->Document->QueryInterface(IID_IHTMLDocument2,(LPVOID*)&pDoc)))
    

    immer fehl und ich bekomme den Link nicht. Mit dem Link darunter auf Sport1 - Fußball Bundesliga klappt das, ich bekomme die Url. Auf der Ergebnisseite gibt es etliche Links, die funktionieren, und etliche, die nicht funktionieren. Woran kann das liegen, und wie komme ich an die Links, die ich momentan nicht bekomme?



  • Ob es klappt oder nicht, scheint von der Position der Maus überhalb des Links abzuhängen: Klickt man mit der rechten Maustaste auf die fett hervorgehobenen Worte, funktioniert die Navigation nicht, klickt man auf den nicht hervorgehobenen Bereich, geht alles. Kann man wunderbar beim ersten Link der erwähnten Suche nachvollziehen: klicken auf "Sport": Fehler. Klicken auf ".de": Alles in Ordnung.
    Wie komme ich an den Link unter "Sport"?



  • Bei mir kommt die Codeausführung nicht über

    if (SUCCEEDED(pElement->QueryInterface(IID_IHTMLAnchorElement,(LPVOID*)&pAnchor)))
    

    hinaus. Die Funktion SUCEEEDED nicht. D.h. Sport ist kein Anchorelement, nur .de .

    Der HTML Code sieht aber an der Stelle wie folgt aus:

    <a href=http://www.sport.de/><b>Sport</b>.de</a>
    

    Vermutung: Wahrscheinlich wird duch das <b>...</b> die Erkennung des Anchorelements ausgehebelt.



  • F98 schrieb:

    Vermutung: Wahrscheinlich wird duch das <b>...</b> die Erkennung des Anchorelements ausgehebelt.

    Ja, vermute ich auch. Aber wie kann ich das trotzdem hinbekommen? Es muß doch eine Möglichkeit geben.


Anmelden zum Antworten