Blog Archives
Xbutton navigation, in integrated browser with c#
Posted by Kelsos
I have been trying for a while to find a way with the application I am developing to navigate Forward or Back using only the xbuttons (4th and 5th button of a 5 button mouse) with the integrated browser. After spending some time trying various things I found a solution posted in one of the msdn sites… unfortunately I don’t remember the URL to link to the site. The original code was in Visual Basic.
Here is the MessageFilter class responsible for the MessageFilter instance that handles the WM_XBUTTONDOWN message.
using System;
using System.Windows.Forms;
public class MessageFilter : IMessageFilter
{
const int WM_XBUTTONDOWN = 0x020B;
const int MK_XBUTTON1 = 65568;
const int MK_XBUTTON2 = 131136;
private Form _form;
private EventHandler _backevent;
private EventHandler _forwardevent;
/// <summary>
/// Initializes a new instance of the <see cref="MessageFilter"/> class.
/// </summary>
/// <param name="f">The form.</param>
/// <param name="backevent">The backevent.</param>
/// <param name="forwardevent">The forwardevent.</param>
public MessageFilter(WebForm f, ref EventHandler backevent, ref EventHandler forwardevent)
{
_form = f;
_backevent = backevent;
_forwardevent = forwardevent;
}
/// <summary>
/// Filters out a message before it is dispatched.
/// </summary>
/// <param name="m">The message to be dispatched. You cannot modify this message.</param>
/// <returns>
/// true to filter the message and stop it from being dispatched; false to allow the message to continue to the next filter or control.
/// </returns>
public bool PreFilterMessage(ref Message m)
{
bool bHandled = false;
if (m.Msg == WM_XBUTTONDOWN)
{
int w = m.WParam.ToInt32();
if (w == MK_XBUTTON1)
{
_backevent.Invoke(_form, EventArgs.Empty);
bHandled = true;
}
else if (w == MK_XBUTTON2)
{
_forwardevent.Invoke(_form, EventArgs.Empty);
bHandled = true;
}
}
return bHandled;
}
}
Furthermore you also have to add the following to the code of the form of the browser element:
In the constructor of the form after the call of the InitializeComponent(); method you have to create some Event Handlers for the following events:
this.HandleCreated += new EventHandler(webForm_HandleCreated); this.HandleDestroyed += new EventHandler(webForm_HandleDestroyed); this.Activated += new EventHandler(webForm_Activated); this.Deactivate += new EventHandler(webForm_Deactivate);
And here are the Event Handle methods:
private void webForm_HandleCreated(object sender, EventArgs e)
{
EventHandler backevent = new EventHandler(backToolStripButton_Click);
EventHandler forwardevent = new EventHandler(forwardToolStripButton_Click);
_mbfilter = new MessageFilter(this, ref backevent, ref forwardevent);
}
private void webForm_HandleDestroyed(object sender, EventArgs e)
{
_mbfilter = null;
}
private void webForm_Activated(object sender, EventArgs e)
{
Application.AddMessageFilter(_mbfilter);
}
private void webForm_Deactivate(object sender, EventArgs e)
{
Application.RemoveMessageFilter(_mbfilter);
}
For the backward and forward EventHandlers, the EventHandlers of the forward and backward buttons are used.
private void backToolStripButton_Click(object sender, EventArgs e)
{
if (geckoReader.CanGoBack)
geckoReader.GoBack();
}
private void forwardToolStripButton_Click(object sender, EventArgs e)
{
if (geckoReader.CanGoForward)
geckoReader.GoForward();
}
geckoReader is an instance of the GeckoFX gecko c# wrapper.
Posted in C#, Computers, Programming
Tags: C#, navigation, programming, web browser, xbutton










