[C#] Use “right double click”

Yes!
It’s double right click!

In this snippet you can use right double click to “go back” on your web browser!
It’s a stupid tricks, but it’s very useful!

Here we go!

As usually, copy and paste this snippet in your windows application.

First of all, you must include this libs:

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]using System.Runtime.InteropServices;
using System.Diagnostics;

private static LowLevelMouseProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
private static MSLLHOOKSTRUCT _posDblClk;
private const int WH_MOUSE_LL = 14;

private enum MouseMessages
{
WM_LBUTTONDOWN = 0x0201,
WM_LBUTTONUP = 0x0202,
WM_MOUSEMOVE = 0x0200,
WM_MOUSEWHEEL = 0x020A,
WM_RBUTTONDOWN = 0x0204,
WM_RBUTTONUP = 0x0205
}

[StructLayout( LayoutKind.Sequential )]
private struct POINT
{
public int x;
public int y;
}

[StructLayout( LayoutKind.Sequential )]
private struct MSLLHOOKSTRUCT
{
public POINT pt;
public uint mouseData;
public uint flags;
public uint time;
public IntPtr dwExtraInfo;
}

[DllImport( "user32.dll", CharSet = CharSet.Auto, SetLastError = true )]
private static extern IntPtr SetWindowsHookEx( int idHook, LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId );

[DllImport( "user32.dll", CharSet = CharSet.Auto, SetLastError = true )]
[return: MarshalAs( UnmanagedType.Bool )]
private static extern bool UnhookWindowsHookEx( IntPtr hhk );

[DllImport( "user32.dll", CharSet = CharSet.Auto, SetLastError = true )]
private static extern IntPtr CallNextHookEx( IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam );

[DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true )]
private static extern IntPtr GetModuleHandle( string lpModuleName );[/code]

Ok, this is first part of code, used to catch mouse event with windows API like kernel32.dll and user32.dll.

After that, create two simple method that invoke mouse hook:

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]private static IntPtr SetHook( LowLevelMouseProc proc )
{
using ( Process curProcess = Process.GetCurrentProcess() )
using ( ProcessModule curModule = curProcess.MainModule ) {
return SetWindowsHookEx( WH_MOUSE_LL, proc, GetModuleHandle( curModule.ModuleName ), 0 );
}
}
private delegate IntPtr LowLevelMouseProc( int nCode, IntPtr wParam, IntPtr lParam );
private static IntPtr HookCallback( int nCode, IntPtr wParam, IntPtr lParam )
{
if ( nCode >= 0 && MouseMessages.WM_RBUTTONDOWN == ( MouseMessages )wParam ) 
{
MSLLHOOKSTRUCT hookStruct = ( MSLLHOOKSTRUCT )Marshal.PtrToStructure( lParam, typeof( MSLLHOOKSTRUCT ) );
if ( ( _posDblClk.pt.x == hookStruct.pt.x ) && ( _posDblClk.pt.y == hookStruct.pt.y ) ) {
SendKeys.Send( "%{LEFT}" );
}
_posDblClk.pt.x = hookStruct.pt.x;
_posDblClk.pt.y = hookStruct.pt.y;
}

return CallNextHookEx( _hookID, nCode, wParam, lParam );
}[/code]

…you can view that in HookCallback function there is a method that use “%{LEFT}”, this is equivalent to ALT+LEFTARROW, used to go back in web browser.

SendKeys.Send( “%{LEFT}” );

When is detected a double right click, the program send to the system the ALT+LEFTARROW keys. If you are in a browser, you go back!

Finally,
in you form init, insert this lines

[code lang=”csharp” autolinks=”false” collapse=”false” firstline=”1″ gutter=”true” htmlscript=”false” light=”false” padlinenumbers=”false” smarttabs=”true” tabsize=”4″ toolbar=”false”]_hookID = SetHook( _proc );
Application.Run();
UnhookWindowsHookEx( _hookID );[/code]

that starting the mouse hook.

Perfect! Compile and test it!

If you like this tricks, add it in Windows Autorun!
If you like this post, click iLike!
If you don’t want to compile and want only to use it, you can download from here.

 

byz

Rif: albertopasca.it

 

Alberto Pasca

Software engineer @ Pirelli & C. S.p.A. with a strong passion for mobile  development, security, and connected things.