Solved

Strange behaviour with ProcessKeyPreview and ProcessCmdKey

Posted on 2006-11-16
2
822 Views
Last Modified: 2011-10-03
Using .NET windows Forms, .NET 1.1 version

I have a custom datagrid, inherited from a windows form datagrid. The grid has rows and columns. I prevent the user from using the arrow keys (up, down, left, right) to go to certain rows or columns. I used the ProcessKeyPreview function of the datagrid to control the arrow keys in another project. In this project, I have more or less the same exact custom datagrid and the ProcessKeyPreview doesn't get fired at all. The strange thing is the ProcessCmdKey is what gets fired. Anyone experienced this? Below is the code. The same exact definition is in ProcessKeyPreview and ProcessCmdKey

**************ProcessKeyPreview
 Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean

        If Not _dt Is Nothing Then
            GetKeyStatus()

            If (m.Msg = WM_KEYDOWN Or (m.Msg = WM_SYSKEYDOWN)) Then
                'ignore the key if invalid edit entered

                Select Case m.WParam.ToInt32
                    Case Keys.Up
                        If _invalidUpKey = True Then
                            Return True
                        Else
                            Return MyBase.ProcessKeyPreview(m)
                        End If

                    Case Keys.Down
                        If _invalidDownKey = True Then
                            Return True
                        Else
                            Return MyBase.ProcessKeyPreview(m)
                        End If

                    Case Keys.Left
                        If _invalidLeftKey = True Then
                            Return True
                        Else
                            Return MyBase.ProcessKeyPreview(m)
                        End If

                    Case Keys.Right
                        If _invalidRightKey = True Then
                            Return True
                        Else
                            Return MyBase.ProcessKeyPreview(m)
                        End If
                End Select


'****************ProcessCmdKey
Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
        If Not _dt Is Nothing Then
            GetKeyStatus()

            If (msg.Msg = WM_KEYDOWN Or (msg.Msg = WM_SYSKEYDOWN)) Then
                'ignore the key if invalid edit entered

                Select Case msg.WParam.ToInt32
                    Case Keys.Up
                        If _invalidUpKey = True Then
                            Return True
                        Else
                            'Return MyBase.ProcessKeyPreview(m)
                            Return MyBase.ProcessCmdKey(msg, keyData)
                        End If

                    Case Keys.Down
                        If _invalidDownKey = True Then
                            Return True
                        Else
                            'Return MyBase.ProcessKeyPreview(m)
                            Return MyBase.ProcessCmdKey(msg, keyData)
                        End If

                    Case Keys.Left
                        If _invalidLeftKey = True Then
                            Return True
                        Else
                            'Return MyBase.ProcessKeyPreview(m)
                            Return MyBase.ProcessCmdKey(msg, keyData)
                        End If

                    Case Keys.Right
                        If _invalidRightKey = True Then
                            Return True
                        Else
                            'Return MyBase.ProcessKeyPreview(m)
                            Return MyBase.ProcessCmdKey(msg, keyData)
                        End If
                End Select

            End If
        End If
    End Function

0
Comment
Question by:Sanmarie
2 Comments
 
LVL 14

Accepted Solution

by:
jake072 earned 500 total points
ID: 17965580
If you read the following articles you will note that ProcessCmdKey PREPROCESSES messages i.e., it processes the messages before they are translated to the form, whereas ProcessKeyPreview handles messages received from the window.  ProcessCmdKey will always hook the event first, and if you handle the event in that method, then ProcessKeyPreview will never fire because the event was consumed in ProcessCmdKey.

Reference:

http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.processkeypreview.aspx
http://msdn2.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx

Jake
0
 

Author Comment

by:Sanmarie
ID: 17967018

Thanks for your response.

I was not handling the ProcessCmdKey method at all. I didn't even have a definition for it. All I had was the ProcessKeyPreview and it was not being fired. That's when I decided to try adding the ProcessCmdKey to see if that would work and it did.

The strange thing is that I used the ProcessKeyPreview to handle the arrow keys in a previous project and it worked fine. Whereas now, in this project it isn't being fired at all. ProcessCmdKey was not used in either project. So, it couldn't be the case that it was preventing the ProcessKeyPreview from being fired.

Thanks for your input though. I will read up more on both

San



0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Article by: jpaulino
XML Literals are a great way to handle XML files and the community doesn’t use it as much as it should.  An XML Literal is like a String (http://msdn.microsoft.com/en-us/library/system.string.aspx) Literal, only instead of starting and ending with w…
Introduction When many people think of the WebBrowser (http://msdn.microsoft.com/en-us/library/2te2y1x6%28v=VS.85%29.aspx) control, they immediately think of a control which allows the viewing and navigation of web pages. While this is true, it's a…
It is a freely distributed piece of software for such tasks as photo retouching, image composition and image authoring. It works on many operating systems, in many languages.
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now