Global Keypress Event Handler

A

Appr3nt1c3

Hello everyone!

I am new to VB .Net and currently i'm using vb .net 2005. My question
is: Is there a way to assign a global key handler for a certain key,
like if i press F9 or any other key from any part of my program, a
function or sub would be invoked? I used to do programming in Clipper
and this done achieved by the Setkey( <nKey>, <bFunction> ) function.


Can this be done in VB .Net?


Thanks in advance!


diego
 
G

Gillard

hi,
here is an answer :

Public Class Form1
' If you just want the hot key, with no modifier

' use zero for the fsModifiers value (But this is a BAD IDEA).

Private Const NoModKey As Integer = 0

' Modifier key constants

Private Const MOD_ALT As Integer = 1

Private Const MOD_CONTROL As Integer = 2

Private Const MOD_SHIFT As Integer = 4

Private Const MOD_WIN As Integer = 8

' Value indicating Windows Message is a hot key.

Protected Friend Const WM_HOTKEY As Integer = 786

' Unique ID for the atomic hot key.

Protected Friend hotkeyID As Short

' Register hotkey

Protected Friend Declare Function RegisterHotKey Lib "user32" (ByVal
hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk
As Keys) As Integer

' Add global name for hotkey

Protected Friend Declare Function GlobalAddAtomA Lib "kernel32" (ByVal
lpString As String) As Short

' Delete hotkey atom.

Protected Friend Declare Function GlobalDeleteAtom Lib "kernel32" (ByVal
nAtom As Integer) As Short

' Unregister hotkey.

Protected Friend Declare Function UnregisterHotKey Lib "user32" (ByVal
hwnd As IntPtr, ByVal id As Integer) As Integer



Private Sub hotkey_Load()

' GlobalAddAtom adds the String to the System global

' atom table, and returns a unique number to identify

' it the atom table.

hotkeyID = GlobalAddAtomA("GlobalHotKeyFor_MyUniqueAppName")

If hotkeyID = 0 Then

MessageBox.Show("Unable to generate the requested hotkey unique
ID.", "Error Making Hotkey ID")

Else

' Register the hot key combo used to show the form.

' I used Alt key modifier and the F1 key, Alt + F1,

' but you can use any key combo.

If RegisterHotKey(Me.Handle, hotkeyID, MOD_ALT, Keys.Delete) = 0
Then

MessageBox.Show("Unable to register the requested hotkey.",
"Error Registering Hotkey")

Else
'mettre la ligne suivante en commentaire pour la production
MessageBox.Show("The following Hotkey was registered for
this application: " & "Keys: Alt + F1", "Hot Key Registered")

End If

End If

End Sub

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

' READ ME:

' You MUST unregister your Hot Key, or your application will leak
memory.



If Me.hotkeyID <> 0 Then

UnregisterHotKey(Me.Handle, hotkeyID)

' Also delete the hot key atom.

GlobalDeleteAtom(hotkeyID)

End If

End Sub



Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

' Check for our Windows Message Hotkey.

If m.Msg = WM_HOTKEY Then

' Do something.

End If

' Return key messages to the application.

MyBase.WndProc(m)

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
hotkey_Load()
End Sub
End Class
 
A

Appr3nt1c3

hi,
here is an answer :

Public Class Form1
    ' If you just want the hot key, with no modifier

    ' use zero for the fsModifiers value (But this is a BAD IDEA).

    Private Const NoModKey As Integer = 0

    ' Modifier key constants

    Private Const MOD_ALT As Integer = 1

    Private Const MOD_CONTROL As Integer = 2

    Private Const MOD_SHIFT As Integer = 4

    Private Const MOD_WIN As Integer = 8

    ' Value indicating Windows Message is a hot key.

    Protected Friend Const WM_HOTKEY As Integer = 786

    ' Unique ID for the atomic hot key.

    Protected Friend hotkeyID As Short

    ' Register hotkey

    Protected Friend Declare Function RegisterHotKey Lib "user32" (ByVal
hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk
As Keys) As Integer

    ' Add global name for hotkey

    Protected Friend Declare Function GlobalAddAtomA Lib "kernel32" (ByVal
lpString As String) As Short

    ' Delete hotkey atom.

    Protected Friend Declare Function GlobalDeleteAtom Lib "kernel32"(ByVal
nAtom As Integer) As Short

    ' Unregister hotkey.

    Protected Friend Declare Function UnregisterHotKey Lib "user32" (ByVal
hwnd As IntPtr, ByVal id As Integer) As Integer

    Private Sub hotkey_Load()

        ' GlobalAddAtom adds the String to the System global

        ' atom table, and returns a unique number to identify

        ' it the atom table.

        hotkeyID = GlobalAddAtomA("GlobalHotKeyFor_MyUniqueAppName")

        If hotkeyID = 0 Then

            MessageBox.Show("Unable to generate the requestedhotkey unique
ID.", "Error Making Hotkey ID")

        Else

            ' Register the hot key combo used to show the form.

            ' I used Alt key modifier and the F1 key, Alt + F1,

            ' but you can use any key combo.

            If RegisterHotKey(Me.Handle, hotkeyID, MOD_ALT, Keys.Delete) = 0
Then

                MessageBox.Show("Unable to register the requested hotkey.",
"Error Registering Hotkey")

            Else
                'mettre la ligne suivante en commentaire pour la production
                MessageBox.Show("The following Hotkey wasregistered for
this application: " & "Keys: Alt + F1", "Hot Key Registered")

            End If

        End If

    End Sub

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

        ' READ ME:

        ' You MUST unregister your Hot Key, or your application will leak
memory.

        If Me.hotkeyID <> 0 Then

            UnregisterHotKey(Me.Handle, hotkeyID)

            ' Also delete the hot key atom.

            GlobalDeleteAtom(hotkeyID)

        End If

    End Sub

    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

        ' Check for our Windows Message Hotkey.

        If m.Msg = WM_HOTKEY Then

            ' Do something.

                    End If

        ' Return key messages to the application.

        MyBase.WndProc(m)

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
             hotkey_Load()
          End Sub
End Class










-Ipakita ang tekstong may panipi-

Thanks for your reply.

How is it done if my startup object is Sub Main()?

Thanks
 
J

Jack Jackson

Hello everyone!

I am new to VB .Net and currently i'm using vb .net 2005. My question
is: Is there a way to assign a global key handler for a certain key,
like if i press F9 or any other key from any part of my program, a
function or sub would be invoked? I used to do programming in Clipper
and this done achieved by the Setkey( <nKey>, <bFunction> ) function.


Can this be done in VB .Net?

You can register a message filter with Application.AddMessageFilter.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top