Browser Helper Object

  • Thread starter Thread starter dwandless
  • Start date Start date
D

dwandless

I have successfully installed a BHO in IE7. Using C#.

Now I'm trying to figure out how to trap various events. onkeypress,
oncut, oncontextmenu, etc.

I have tried calling in various IHTMLElement2.attachEvent, but no
success. attachEvent wants two parameters: event name, and object
pdisp.

I cannot find the correct means to populate pdisp. Or is there another
way to trap events from a BHO and C#?

Any help would be greatly appreciated.

Thanks.
 
I did try that.

public delegate void F();
F f = delegate () { MessageBox.Show ("delegate");};
IHTMLElement2 h;
h.attachEvent ("oncut", f);

Maybe the signature is not correct.

I did try passing various other signatures for the delegate.

If you have a specific example that would be great. I am stumped.
Duane
 
Hi,

There is a lot of stuff on the web about this problem. I searched in
groups.google.com for "dotnet default method" and read some MSDN articles as
well (most pertaining to legacy VB).

Basically, the HTML events require an IDispatch interface to invoke a default,
parameterless method, which C# doesn't support. I tried a bunch of things
using DispIdAttribute, ClassInterfaceAttribute and DispatchWrapper but I
couldn't get it to work. Assignment always throws an InvalidCastException
(presumably because I didn't go as far as implementing IDispatch :)

In the 2.0 framework I use the HtmlElement.AttachEventHandler method, which
allows me to supply an EventHandler delegate. Unfortunately, I doubt you'll
be able to go that route because the class itself is dependant on the
WebBrowser control, but you might want to take a peek at how it's accomplished
in that class.
 
Amazingly I think I have it working. So for all you searching out
there. Try this:

public class
{
DispatcherClass dp = new DispatcherClass();

<< do code to get the IHTMLElements >>
foreach (IHTMLElement myTag in allTag1)
{
myTag.onkeypress = dp;
}
}

public DispatcherClass
{
[DispId(0)]
public void DefaultMethod()
{
// do your code
}
}
The key is the [DispId(0)]. This allows IDispatch to callback into my
C# code.

Of course now I have the event firing I'm not exactly sure how to find
out which key was pressed. I also could not get
IHTMLElement2.attachEvents() to work. But that is for another day.

Good luck.
 
Hi,

Interesting that works for you because I tried that and many variants but
nothing worked for me (neither attachEvents nor direct assignment) but then
again I was trying it with the WebBrowser control and the MSHTML PIA, so there
could be inconstancies.

Anyway, if you want to find the key that was pressed you need to access the
event object on the IHTMLWindow2. Note however that in C# the event is a
keyword so it must be accessed as follows (I think this only applies when
using the PIA, IIRC):

IHTMLWindow2 window = (IHTMLWindow2) winObj;

// Using the Keys enumeration has worked for me in the past,
// but you'll want to test it anyway just to be sure it works for you
Keys keys = (Keys) (e-mail address removed)

--
Dave Sexton

Amazingly I think I have it working. So for all you searching out
there. Try this:

public class
{
DispatcherClass dp = new DispatcherClass();

<< do code to get the IHTMLElements >>
foreach (IHTMLElement myTag in allTag1)
{
myTag.onkeypress = dp;
}
}

public DispatcherClass
{
[DispId(0)]
public void DefaultMethod()
{
// do your code
}
}
The key is the [DispId(0)]. This allows IDispatch to callback into my
C# code.

Of course now I have the event firing I'm not exactly sure how to find
out which key was pressed. I also could not get
IHTMLElement2.attachEvents() to work. But that is for another day.

Good luck.
 
Fantastic. Thanks again for the push in the right direction. I now
can see which key was pressed. Here is the basic code.

public DispatcherClass(BHO callback)
{
m_callback = callback;
}
[DispId(0)]
public void DefaultMethod()
{
Keys key = m_callback.CallBack();
<< do your code >>
}
=======================
public class BHO
{
DispatcherClass dp;

BHO()
{
dp = new DispatcherClass (this);
}

public Keys CallBack()
{
//m_window1 is the saved IHTMLWindow2 that I'm watching
return (Keys)[email protected];
}

public someFunc()
{
<< do code to get the IHTMLElements >>
foreach (IHTMLElement myTag in allTag)
{
myTag.onkeypress = dp;
}
}

Dave said:
Hi,

Interesting that works for you because I tried that and many variants but
nothing worked for me (neither attachEvents nor direct assignment) but then
again I was trying it with the WebBrowser control and the MSHTML PIA, so there
could be inconstancies.

Anyway, if you want to find the key that was pressed you need to access the
event object on the IHTMLWindow2. Note however that in C# the event is a
keyword so it must be accessed as follows (I think this only applies when
using the PIA, IIRC):

IHTMLWindow2 window = (IHTMLWindow2) winObj;

// Using the Keys enumeration has worked for me in the past,
// but you'll want to test it anyway just to be sure it works for you
Keys keys = (Keys) (e-mail address removed)

--
Dave Sexton

Amazingly I think I have it working. So for all you searching out
there. Try this:

public class
{
DispatcherClass dp = new DispatcherClass();

<< do code to get the IHTMLElements >>
foreach (IHTMLElement myTag in allTag1)
{
myTag.onkeypress = dp;
}
}

public DispatcherClass
{
[DispId(0)]
public void DefaultMethod()
{
// do your code
}
}
The key is the [DispId(0)]. This allows IDispatch to callback into my
C# code.

Of course now I have the event firing I'm not exactly sure how to find
out which key was pressed. I also could not get
IHTMLElement2.attachEvents() to work. But that is for another day.

Good luck.


Dave said:
Hi,

There is a lot of stuff on the web about this problem. I searched in
groups.google.com for "dotnet default method" and read some MSDN articles
as
well (most pertaining to legacy VB).

Basically, the HTML events require an IDispatch interface to invoke a
default,
parameterless method, which C# doesn't support. I tried a bunch of things
using DispIdAttribute, ClassInterfaceAttribute and DispatchWrapper but I
couldn't get it to work. Assignment always throws an InvalidCastException
(presumably because I didn't go as far as implementing IDispatch :)

In the 2.0 framework I use the HtmlElement.AttachEventHandler method, which
allows me to supply an EventHandler delegate. Unfortunately, I doubt
you'll
be able to go that route because the class itself is dependant on the
WebBrowser control, but you might want to take a peek at how it's
accomplished
in that class.

--
Dave Sexton

I did try that.

public delegate void F();
F f = delegate () { MessageBox.Show ("delegate");};
IHTMLElement2 h;
h.attachEvent ("oncut", f);

Maybe the signature is not correct.

I did try passing various other signatures for the delegate.

If you have a specific example that would be great. I am stumped.
Duane


Dave Sexton wrote:
Hi,

The second parameter is the function pointer. Try passing in a
delegate.

--
Dave Sexton

I have successfully installed a BHO in IE7. Using C#.

Now I'm trying to figure out how to trap various events. onkeypress,
oncut, oncontextmenu, etc.

I have tried calling in various IHTMLElement2.attachEvent, but no
success. attachEvent wants two parameters: event name, and object
pdisp.

I cannot find the correct means to populate pdisp. Or is there
another
way to trap events from a BHO and C#?

Any help would be greatly appreciated.

Thanks.
 
Hi,

Glad to help, but just FYI you don't have to attach an onkeypress handler to
every element.

Check out the section on even bubbling in the following article.

About the DHTML Object Model on MSDN:
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/om/doc_object.asp?frame=true

Also, you might be interested in implementing an Html Edit Designer if you
want to handle many events on many elements, or on a document that changes the
DOM frequently. I have gotten that to work using the WebBrowser control and
the MSHTML PIA, so I know it's possible, although it's commonly used for
browsers in design mode, but that's not necessary.

Implementing Edit Designers: The Basics on MSDN:
http://msdn.microsoft.com/library/d...owser/editing/editdesignerimp1.asp?frame=true

--
Dave Sexton

Fantastic. Thanks again for the push in the right direction. I now
can see which key was pressed. Here is the basic code.

public DispatcherClass(BHO callback)
{
m_callback = callback;
}
[DispId(0)]
public void DefaultMethod()
{
Keys key = m_callback.CallBack();
<< do your code >>
}
=======================
public class BHO
{
DispatcherClass dp;

BHO()
{
dp = new DispatcherClass (this);
}

public Keys CallBack()
{
//m_window1 is the saved IHTMLWindow2 that I'm watching
return (Keys)[email protected];
}

public someFunc()
{
<< do code to get the IHTMLElements >>
foreach (IHTMLElement myTag in allTag)
{
myTag.onkeypress = dp;
}
}

Dave said:
Hi,

Interesting that works for you because I tried that and many variants but
nothing worked for me (neither attachEvents nor direct assignment) but then
again I was trying it with the WebBrowser control and the MSHTML PIA, so
there
could be inconstancies.

Anyway, if you want to find the key that was pressed you need to access the
event object on the IHTMLWindow2. Note however that in C# the event is a
keyword so it must be accessed as follows (I think this only applies when
using the PIA, IIRC):

IHTMLWindow2 window = (IHTMLWindow2) winObj;

// Using the Keys enumeration has worked for me in the past,
// but you'll want to test it anyway just to be sure it works for you
Keys keys = (Keys) (e-mail address removed)

--
Dave Sexton

Amazingly I think I have it working. So for all you searching out
there. Try this:

public class
{
DispatcherClass dp = new DispatcherClass();

<< do code to get the IHTMLElements >>
foreach (IHTMLElement myTag in allTag1)
{
myTag.onkeypress = dp;
}
}

public DispatcherClass
{
[DispId(0)]
public void DefaultMethod()
{
// do your code
}
}
The key is the [DispId(0)]. This allows IDispatch to callback into my
C# code.

Of course now I have the event firing I'm not exactly sure how to find
out which key was pressed. I also could not get
IHTMLElement2.attachEvents() to work. But that is for another day.

Good luck.


Dave Sexton wrote:
Hi,

There is a lot of stuff on the web about this problem. I searched in
groups.google.com for "dotnet default method" and read some MSDN
articles
as
well (most pertaining to legacy VB).

Basically, the HTML events require an IDispatch interface to invoke a
default,
parameterless method, which C# doesn't support. I tried a bunch of
things
using DispIdAttribute, ClassInterfaceAttribute and DispatchWrapper but I
couldn't get it to work. Assignment always throws an
InvalidCastException
(presumably because I didn't go as far as implementing IDispatch :)

In the 2.0 framework I use the HtmlElement.AttachEventHandler method,
which
allows me to supply an EventHandler delegate. Unfortunately, I doubt
you'll
be able to go that route because the class itself is dependant on the
WebBrowser control, but you might want to take a peek at how it's
accomplished
in that class.

--
Dave Sexton

I did try that.

public delegate void F();
F f = delegate () { MessageBox.Show ("delegate");};
IHTMLElement2 h;
h.attachEvent ("oncut", f);

Maybe the signature is not correct.

I did try passing various other signatures for the delegate.

If you have a specific example that would be great. I am stumped.
Duane


Dave Sexton wrote:
Hi,

The second parameter is the function pointer. Try passing in a
delegate.

--
Dave Sexton

I have successfully installed a BHO in IE7. Using C#.

Now I'm trying to figure out how to trap various events.
onkeypress,
oncut, oncontextmenu, etc.

I have tried calling in various IHTMLElement2.attachEvent, but no
success. attachEvent wants two parameters: event name, and object
pdisp.

I cannot find the correct means to populate pdisp. Or is there
another
way to trap events from a BHO and C#?

Any help would be greatly appreciated.

Thanks.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Back
Top