Trouble Implementing IMessageFilter

vendiddy

Well-known member
Joined
May 14, 2006
Messages
64
Programming Experience
1-3
I'm new to this and I'm having trouble implementing the IMessageFilter. I found some code on the internet that detects changes in the clipboard and tried to encapsulate the code into a class using the IMessageFilter.

It's not working though, and I don't know why.

In the main form_load event, I say:
VB.NET:
[SIZE=2]ClipboardListener = [/SIZE][SIZE=2][COLOR=#0000ff]New[/COLOR][/SIZE][SIZE=2] ClipboardEvent([/SIZE][SIZE=2][COLOR=#0000ff]Me[/COLOR][/SIZE][SIZE=2])[/SIZE]

VB.NET:
[COLOR=blue][FONT=Courier New]Public[/FONT][/COLOR][FONT=Courier New] [COLOR=blue]Class[/COLOR] [COLOR=black]ClipboardEvent[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Inherits[/COLOR] [COLOR=black]EventTrigger[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Implements[/COLOR] [COLOR=black]IMessageFilter[/COLOR][/FONT]
 
[FONT=Courier New] [COLOR=blue]Private[/COLOR] [COLOR=black]handle[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=blue]Integer[/COLOR][/FONT]
 
[FONT=Courier New] [COLOR=blue]Public[/COLOR] [COLOR=blue]Sub[/COLOR] [COLOR=blue]New[/COLOR]([COLOR=blue]ByVal[/COLOR] [COLOR=black]f[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]Form[/COLOR])[/FONT]
[FONT=Courier New]     [COLOR=blue]Me[/COLOR].[COLOR=black]handle[/COLOR] = [COLOR=black]f[/COLOR].[COLOR=black]Handle[/COLOR].[COLOR=black]ToInt32[/COLOR][/FONT]
[FONT=Courier New]     [COLOR=black]Application[/COLOR].[COLOR=black]AddMessageFilter[/COLOR]([COLOR=blue]Me[/COLOR])[/FONT]
[FONT=Courier New]     [COLOR=black]mNextClipBoardViewerHWnd[/COLOR] = [COLOR=black]SetClipboardViewer[/COLOR]([COLOR=blue]Me[/COLOR].[COLOR=black]handle[/COLOR])[/FONT]
[FONT=Courier New] [COLOR=blue]End[/COLOR] [COLOR=blue]Sub[/COLOR][/FONT]
 
[FONT=Courier New] [COLOR=blue]Public[/COLOR] [COLOR=blue]Function[/COLOR] [COLOR=black]PreFilterMessage[/COLOR]([COLOR=blue]ByRef[/COLOR] [COLOR=black]m[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]System[/COLOR].[COLOR=black]Windows[/COLOR].[COLOR=black]Forms[/COLOR].[COLOR=black]Message[/COLOR]) [COLOR=blue]As[/COLOR] [COLOR=blue]Boolean[/COLOR] [COLOR=blue]Implements[/COLOR] [COLOR=black]System[/COLOR].[COLOR=black]Windows[/COLOR].[COLOR=black]Forms[/COLOR].[COLOR=black]IMessageFilter[/COLOR].[COLOR=black]PreFilterMessage[/COLOR][/FONT]
[FONT=Courier New]     [COLOR=blue]Select[/COLOR] [COLOR=blue]Case[/COLOR] ([COLOR=black]m[/COLOR].[COLOR=black]Msg[/COLOR])[/FONT]
[FONT=Courier New]         [COLOR=green]'Below are the clipboard events.[/COLOR][/FONT]
[FONT=Courier New]         [COLOR=blue]Case[/COLOR] [COLOR=blue]Is[/COLOR] = [COLOR=black]WM_DRAWCLIPBOARD[/COLOR] [COLOR=green]'The clipboard has changed...[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=green]'##########################################################################[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=green]' Process Clipboard Here :)........................[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=green]'##########################################################################[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=black]MessageBox[/COLOR].[COLOR=black]Show[/COLOR]([COLOR=maroon]"clipboard changed"[/COLOR])[/FONT]
[FONT=Courier New]             [COLOR=blue]If[/COLOR] [COLOR=black]mNextClipBoardViewerHWnd[/COLOR] <> [COLOR=blue]Nothing[/COLOR] [COLOR=blue]Then[/COLOR][/FONT]
[FONT=Courier New]                 [COLOR=black]SendMessage[/COLOR]([COLOR=black]mNextClipBoardViewerHWnd[/COLOR], [COLOR=black]m[/COLOR].[COLOR=black]Msg[/COLOR], [COLOR=black]m[/COLOR].[COLOR=black]WParam[/COLOR], [COLOR=black]m[/COLOR].[COLOR=black]LParam[/COLOR])[/FONT]
[FONT=Courier New]             [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR][/FONT]
[FONT=Courier New]         [COLOR=blue]Case[/COLOR] [COLOR=blue]Is[/COLOR] = [COLOR=black]WM_CHANGECBCHAIN[/COLOR] [COLOR=green]'Another clipboard viewer has removed itself...[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=blue]If[/COLOR] [COLOR=black]m[/COLOR].[COLOR=black]WParam[/COLOR] = [COLOR=blue]CType[/COLOR]([COLOR=black]mNextClipBoardViewerHWnd[/COLOR], [COLOR=black]IntPtr[/COLOR]) [COLOR=blue]Then[/COLOR][/FONT]
[FONT=Courier New]                 [COLOR=black]mNextClipBoardViewerHWnd[/COLOR] = [COLOR=black]m[/COLOR].[COLOR=black]LParam[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=blue]Else[/COLOR][/FONT]
[FONT=Courier New]                 [COLOR=blue]If[/COLOR] [COLOR=black]mNextClipBoardViewerHWnd[/COLOR] <> [COLOR=blue]Nothing[/COLOR] [COLOR=blue]Then[/COLOR][/FONT]
[FONT=Courier New]                     [COLOR=black]SendMessage[/COLOR]([COLOR=black]mNextClipBoardViewerHWnd[/COLOR], [COLOR=black]m[/COLOR].[COLOR=black]Msg[/COLOR], [COLOR=black]m[/COLOR].[COLOR=black]WParam[/COLOR], [COLOR=black]m[/COLOR].[COLOR=black]LParam[/COLOR])[/FONT]
[FONT=Courier New]                 [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR][/FONT]
[FONT=Courier New]             [COLOR=blue]End[/COLOR] [COLOR=blue]If[/COLOR][/FONT]
[FONT=Courier New]     [COLOR=blue]End[/COLOR] [COLOR=blue]Select[/COLOR][/FONT]
[FONT=Courier New]     [COLOR=blue]Return[/COLOR] [COLOR=blue]False[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]End[/COLOR] [COLOR=blue]Function[/COLOR][/FONT]
 
[FONT=Courier New]#[COLOR=blue]Region[/COLOR] [COLOR=maroon]"API Declarations"[/COLOR][/FONT]
[FONT=Courier New] [COLOR=green]'Constants for API Calls...[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Private[/COLOR] [COLOR=blue]Const[/COLOR] [COLOR=black]WM_DRAWCLIPBOARD[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=blue]Integer[/COLOR] = &H308[/FONT]
[FONT=Courier New] [COLOR=blue]Private[/COLOR] [COLOR=blue]Const[/COLOR] [COLOR=black]WM_CHANGECBCHAIN[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=blue]Integer[/COLOR] = &H30D[/FONT]
 
[FONT=Courier New] [COLOR=green]'Handle for next clipboard viewer...[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Private[/COLOR] [COLOR=black]mNextClipBoardViewerHWnd[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR][/FONT]
 
[FONT=Courier New] [COLOR=green]'API declarations...[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Declare[/COLOR] [COLOR=blue]Auto[/COLOR] [COLOR=blue]Function[/COLOR] [COLOR=black]SetClipboardViewer[/COLOR] [COLOR=blue]Lib[/COLOR] [COLOR=maroon]"user32"[/COLOR] ([COLOR=blue]ByVal[/COLOR] [COLOR=black]HWnd[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR]) [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Declare[/COLOR] [COLOR=blue]Auto[/COLOR] [COLOR=blue]Function[/COLOR] [COLOR=black]ChangeClipboardChain[/COLOR] [COLOR=blue]Lib[/COLOR] [COLOR=maroon]"user32"[/COLOR] ([COLOR=blue]ByVal[/COLOR] [COLOR=black]HWnd[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR], [COLOR=blue]ByVal[/COLOR] [COLOR=black]HWndNext[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR]) [COLOR=blue]As[/COLOR] [COLOR=blue]Boolean[/COLOR][/FONT]
[FONT=Courier New] [COLOR=blue]Declare[/COLOR] [COLOR=blue]Auto[/COLOR] [COLOR=blue]Function[/COLOR] [COLOR=black]SendMessage[/COLOR] [COLOR=blue]Lib[/COLOR] [COLOR=maroon]"Users32"[/COLOR] ([COLOR=blue]ByVal[/COLOR] [COLOR=black]HWnd[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR], [COLOR=blue]ByVal[/COLOR] [COLOR=black]Msg[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=blue]Integer[/COLOR], [COLOR=blue]ByVal[/COLOR] [COLOR=black]wParam[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR], [COLOR=blue]ByVal[/COLOR] [COLOR=black]lParam[/COLOR] [COLOR=blue]As[/COLOR] [COLOR=black]IntPtr[/COLOR]) [COLOR=blue]As[/COLOR] [COLOR=blue]Long[/COLOR][/FONT]
[FONT=Courier New]#[COLOR=blue]End[/COLOR] [COLOR=blue]Region[/COLOR][/FONT]
 
[FONT=Courier New] [COLOR=blue]Protected[/COLOR] [COLOR=blue]Overrides[/COLOR] [COLOR=blue]Sub[/COLOR] [COLOR=black]Finalize[/COLOR]()[/FONT]
[FONT=Courier New]     [COLOR=green]'Set the next clipboard viewer back to the original... [/COLOR][/FONT]
[FONT=Courier New]     [COLOR=black]ChangeClipboardChain[/COLOR]([COLOR=blue]Me[/COLOR].[COLOR=black]handle[/COLOR], [COLOR=black]mNextClipBoardViewerHWnd[/COLOR])[/FONT]
 
[FONT=Courier New]     [COLOR=blue]MyBase[/COLOR].[COLOR=black]Finalize[/COLOR]()[/FONT]
[FONT=Courier New] [COLOR=blue]End[/COLOR] [COLOR=blue]Sub[/COLOR][/FONT]
[COLOR=blue][FONT=Courier New]End[/FONT][/COLOR][FONT=Courier New] [COLOR=blue]Class[/COLOR][/FONT]

Thanks. :cool:
 
There is nothing wrong with the way you are implementing the IMessageFilter Interface. But your select statement looks a bit weird..

VB.NET:
Case Is = WM_DRAWCLIPBOARD

should just be....


VB.NET:
Case WM_DRAWCLIPBOARD
 
Fixed my case statements, but the "clipboard changed" messagebox never pops up when the clipboard changes. It used to work when I had the code embedded in my main form and I overrode WndProc

Thanks.
 
There have been certain instances where ImessageFilter doesn't always get the messges that i have noticed also. If you want to create a message loop in the class that doesn't use IMessageFilter you can use...

GetMessage
TranslateMessage
DispatchMessage

The above are API's you can use to create a message loop from anywhere within your application.
 
Back
Top