expertenaustausch > microsoft.* > microsoft.vc

Peter Mairhofer (18.05.2010, 22:09)
Hi,

Mit meinem CHtmlView habe ich folgendes Problem: Ich möchte nach dem
Laden der Seite ein bestimmtes Element fokussieren. Dafür verwende ich
beispielhaft folgenden Code:

LPDISPATCH pDisp = GetHtmlDocument();
ASSERT(pDisp);
IHTMLDocument2 *pDocument = NULL;
HRESULT hresult = pDisp->QueryInterface(IID_IHTMLDocument2,
(void**)&pDocument );
ASSERT(SUCCEEDED(hresult));
ASSERT(pDocument);

IHTMLElementCollection *pAll = NULL;
hresult = pDocument->get_all(&pAll);
ASSERT(SUCCEEDED(hresult));
ASSERT(pAll);

IDispatch *ppvdispItem;
VARIANT index;
index.vt = VT_I4;
index.lVal = 6712; // INDEX des Elements das gefocused werden soll
hresult = pAll->item(index, index, &ppvdispItem);
ASSERT(SUCCEEDED(hresult));
ASSERT(ppvdispItem);

IHTMLAnchorElement *pActive = NULL;
hresult = ppvdispItem->QueryInterface(IID_IHTMLAnchorElement,
(void**)&pActive);
ASSERT(SUCCEEDED(hresult));
ASSERT(pActive);

hresult = pActive->focus();

Rufe ich den Code über das Menü aus, so funktioniert alles hervorragend:
Das Element #6712 bekommt den Fokus: Es wird automatisch dort
hingescrollt und der Link erhält den gewünschten Rahmen.

(Für das ganze Werkerl (es soll eine "Browser-History" für meine
Anwendung werden) habe ich nun den ganzen Tag gebraucht).

Ich möchte das aber automatisiert nach dem Laden eines Dokuments machen.
Ich hab es nun schon in OnNavigateComplete2 als auch in
OnDocumentComplete versucht, aber hier funktioniert der Code einfach
nicht :-(

An was könnte das liegen?

LG
Peter
Peter Mairhofer (18.05.2010, 22:31)
Hi,

Am 18.05.2010 22:09, schrieb Peter Mairhofer:
> Mit meinem CHtmlView habe ich folgendes Problem: Ich möchte nach dem
> Laden der Seite ein bestimmtes Element fokussieren.
> [...]
> Ich hab es nun schon in OnNavigateComplete2 als auch in
> OnDocumentComplete versucht, aber hier funktioniert der Code einfach
> nicht :-(


Ich hab das Problem gefunden: Ein OnLoad im Body des Dokumentes zerstört
alles :-( :-(

Gibt es eine Möglichkeit, C++ Code *nach* dem OnLoad auszuführen?

Alternativ: Kann ich eine JavaScript Funktion (die die bis jetzt in
OnLoad steht) in OnDocumentComplete aufrufen?

LG
Peter
Peter Mairhofer (18.05.2010, 23:15)
Hi,

Am 18.05.2010 22:31, schrieb Peter Mairhofer:
> [...]
> Alternativ: Kann ich eine JavaScript Funktion (die die bis jetzt in
> OnLoad steht) in OnDocumentComplete aufrufen?


Juhuu, ich darf mir selbst antworten! Es scheint zu funktionieren :-)



LG
Peter
Hans-J. Ude (19.05.2010, 10:41)
Peter Mairhofer schrieb:

>Alternativ: Kann ich eine JavaScript Funktion (die die bis jetzt in
>OnLoad steht) in OnDocumentComplete aufrufen?


Tu's nicht, manche Benutzer haben Javascript aus guten Gründen
abgestellt, die können dein Programm dann nicht benutzen.

Hajü
Martin Richter [MVP] (19.05.2010, 12:47)
Hallo Peter!

> Ich möchte das aber automatisiert nach dem Laden eines Dokuments machen.
> Ich hab es nun schon in OnNavigateComplete2 als auch in
> OnDocumentComplete versucht, aber hier funktioniert der Code einfach
> nicht :-(


Mach es doch einfach so: Wenn Du OnNavigateComplete2 bekommst machst Du
einen PostMessage an Dein Hauptfenster. Dort führst Du dann das
Markieren des Elementes aus.

Man muss beim HTML Control of die Aktionen entkoppeln. D.h. man kann oft
nicht im Event Handler schon machen was man will... ;)
Peter Mairhofer (19.05.2010, 14:00)
Am 19.05.2010 10:41, schrieb Hans-J. Ude:
> Peter Mairhofer schrieb:
>> Alternativ: Kann ich eine JavaScript Funktion (die die bis jetzt in
>> OnLoad steht) in OnDocumentComplete aufrufen?

> Tu's nicht, manche Benutzer haben Javascript aus guten Gründen
> abgestellt, die können dein Programm dann nicht benutzen.


Hi,

Bitte sag das nicht! :-(

Jetzt hab ich es so gelöst und es funktioniert gut. Anders habe ich
keine Idee wie ich es angehen soll

Kann ich nicht mein Control in eine trusted Zone setzen oder Scripting
für mein Control aktivieren?

Ich sehe gerade: Wenn das stimmt dann geht meine Anwendung sowieso
nicht. Ich brauche dort Scripts, das lässt sich nicht ändern...

LG
Peter
Peter Mairhofer (19.05.2010, 14:05)
Hi,

Und Danke mal.

Am 19.05.2010 12:47, schrieb Martin Richter [MVP]:
> Hallo Peter!
> Mach es doch einfach so: Wenn Du OnNavigateComplete2 bekommst machst Du
> einen PostMessage an Dein Hauptfenster. Dort führst Du dann das
> Markieren des Elementes aus.


Das Problem ist ja, dass bei onLoad noch ein Script aufgerufen wird das
z.B. eine Non-Scrolling Area erstellt. Dieser Aufruf macht mein
Markieren zu Nichte. Das Markieren dürfte also erst nach dem OnLoad
stattfinden.

LG Peter
Peter Mairhofer (25.05.2010, 15:28)
Am 19.05.2010 14:00, schrieb Peter Mairhofer:
> Am 19.05.2010 10:41, schrieb Hans-J. Ude:
> Hi,
> Bitte sag das nicht! :-(
>[...]


:-) Wie es aussieht scheint sich das Problem gelöst zu haben. Zuerst
wollte ich mühevoll meinen eigenen SecurityManager implementieren (der
dann überall ALLOW zurückliefert) aber mit folgender Einstellung scheint
es zu gehen:

Ich habe ein Asynchronous Pluggable Protocol und habe ParseUrl wie folgt
implementiert:

STDMETHODIMP CMyPluggableProtocol::ParseUrl(LPCWSTR pwzUrl,
PARSEACTION parseAction, DWORD dwParseFlags, LPWSTR pwzResult,
DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
{
CString pch;
switch(parseAction)
{
case PARSE_SECURITY_URL:
pch = pwzUrl;
if(pch.GetLength() <= 12)
return INET_E_DEFAULT_ACTION;

pch.Replace(_T("//"), _T("/"));
pch.Replace(_T(":"), _T(""));
pch.Insert(0, _T("file:///C:/"));

if(cchResult <= static_cast<DWORD>(pch.GetLength()))
{
*pcchResult = static_cast<DWORD>(pch.GetLength() + 2);
return S_FALSE;
}

swprintf(pwzResult, pch);
*pcchResult = static_cast<DWORD>(wcslen(pwzResult) + 2);

return S_OK;
}

return INET_E_DEFAULT_ACTION;
}

Meine Anwendung scheint jetzt die Scripts *immer* auszuführen! Ich habe
jetzt alles in den Interneteingenschaften | Sicherheit auf "hoch"
gestellt und es geht trotzdem noch. Sogar wenn JavaScript bei "Lokales
Intranet" und "Vertrauenswürdige Sites" deaktiviert ist.

Kann mir jemand der selbst schon solche Anwendungen geschrieben hat
bestätigen dass das wirklich korrekt ist und ich mich drauf verlassen
kann dass meine Scripts gehen?

Danke und LG,
Peter
:-)
Hans-J. Ude (25.05.2010, 23:40)
"Peter Mairhofer" <63832452> schrieb:

> Kann mir jemand der selbst schon solche Anwendungen geschrieben hat
> bestätigen dass das wirklich korrekt ist und ich mich drauf verlassen kann
> dass meine Scripts gehen?


Ich habe noch keine solche Anwendung geschrieben und auch nicht genau
nachvollzogen, was du da gemacht hast. Aber mal ein anderes Beispiel: Auf
einmal hatte ich massive Probleme mit VS 2005, die vorher nicht da waren.
Und war's am Ende? Probleme mit dem Scripting vom neu installierten IE8 (per
Update aufgedrückt gekriegt, ich surfe mit dem IE Gelumpe nicht durch die
Gegend). Da war ich froh, noch diese Webseite gefunden zu haben:



Nur um mal aufzuzeigen, was solche Trickserei für Folgen haben kann.
Verlassen kann man sich bei sowas auf gar nichts, Ich wär da zurückhaltend.

Hajü
Ähnliche Themen