Microsoft Communities

Welcome to WindowsClient.net | Sign in | Join

Here are some frequently asked questions about Windows Forms and their answers.

Windows Forms FAQs

How do I process keyboard messages on an application-wide basis?

You can implement the IMessageFilter interface in your main form. This amounts to adding an override for PreFilterMessage, and looking for the particular message you need to catch. Here are code snippets that catch an escape key on a keydown. You can download a sample project(C#, VB). In the sample, there are two forms, with several controls. You'll notice that no matter what form or control has input focus, the escape key is caught in the PreFilterMessage override.

[C#]

public class MyMainForm : System.Windows.Forms.Form, IMessageFilter 
{ 
const int WM_KEYDOWN = 0x100; 
const int WM_KEYUP = 0x101; 
public bool PreFilterMessage(ref Message m) 
{ 
Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode; 
if(m.Msg == WM_KEYDOWN&& keyCode == Keys.Escape) 
{ 
Console.WriteLine("Ignoring Escape..."); 
return true; 
} 
return false; 
} 
.... 
private void MyMainForm_Load(object sender, System.EventArgs e) 
{ 
Application.AddMessageFilter(this); 
} 
} 

[Visual Basic]

Public Class MyMainForm 
Inherits System.Windows.Forms.Form 
Implements IMessageFilter 
Private WM_KEYDOWN As Integer = &H100 
Private WM_KEYUP As Integer = &H101 
Public Function PreFilterMessage(ByRef m As Message) As Boolean 
Dim keyCode As Keys = CType(CInt(m.WParam), Keys) And Keys.KeyCode 
If m.Msg = WM_KEYDOWN And keyCode = Keys.Escape Then 
Console.WriteLine("Ignoring Escape...") 
Return True 
End If 
Return False 
End Function 'PreFilterMessage 
.... 
Private Sub MyMainForm_Load(sender As Object, e As System.EventArgs) 
Application.AddMessageFilter(Me) 
End Sub 'MyMainForm_Load 
End Class 'MyMainForm

Contributed from George Shepherd's Windows Forms FAQ



Page view counter