Springen naar inhoud


Tutorial info

  • Toegevoegd op: 07 feb 2011 21:04
  • Bekeken: 5150
 


* * * * *
0 Beoordeling

Hotkey class

Geplaatst door pascalbianca op07 feb 2011 21:04
Contributed by : Vozzie

Om duidelijk te zijn wat we bedoelen met Hotkey , dit is voor ons vertaald een sneltoets.
De Hotkeys class maakt het gemakkelijk om global hotkeys in te stellen voor toepassingen.
Het is een wrapper class die een HotkeyPressed gebeurtenis opvangt wanneer een geregistreerde hotkey door de Hotkeys class wordt ingedrukt.
De class  is een verzameling van geregistreerde hotkeys (in een Hotkey data type).
De Hotkeys class kan worden gebruikt om te register, unregister, of replace (registered door de snel Hotkeys) hotkeys.

We kunnen hotkeys zo gebruiken in ons project maar we zouden het ook in een Class kunnen steken, dit is wat we hieronder gaan doen.

We maken een nieuw project aan van Windows Form Application .
We plaatsen als we in de code gedeelte zitten de volgende code:

Visual Basic Code:
Public Class Form1

	Private WithEvents button As Button
	Private WithEvents hotkey As Hotkey

	Private Sub MainForm_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
		Me.hotkey.Unregister()
	End Sub

	Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
		Me.button = New Button
		Me.button.Text = "click me to make the application invisible, then press CONTROL+ALT+O"
		Me.button.Dock = DockStyle.Fill
		Me.Controls.Add(Me.button)

		Me.hotkey = hotkey.Register(HotkeyModifiers.Control Or HotkeyModifiers.Alt, Keys.O)
	End Sub

	Private Sub hotkey_HotkeyPressed(ByVal sender As Object, ByVal e As HotkeyPressedEventArgs) Handles hotkey.HotkeyPressed
		Me.Visible = True
	End Sub

	Private Sub button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button.Click
		Me.Visible = False
	End Sub

End Class


Als je dit zou testen blijkt dat je een fout krijgt op 4 plaatsen in je code:
(deze zijn in onderstaande code onderstreept!!!)

Geplaatste afbeelding

Waarom? Nou we hebben namelijk nog geen class hiervoor aangemaakt.
Dus maken we deze nu aan door een Class toe te voegen aan je project.

Geplaatste afbeelding

Genaamd HotkeyPressedEventArgs en klikken dan op OK.
Plaats hierin de volgende code:

Visual Basic Code:
Imports System.Runtime.InteropServices

Public Class HotkeyPressedEventArgs
	Inherits System.EventArgs

	Private _modifiers As HotkeyModifiers

	Friend Sub New(ByVal modifiers As HotkeyModifiers)
		Me._modifiers = modifiers
	End Sub

	Public ReadOnly Property Modifiers() As HotkeyModifiers
		Get
			Return Me._modifiers
		End Get
	End Property

End Class

Public Delegate Sub HotkeyPressedEventHandler(ByVal sender As Object, ByVal e As HotkeyPressedEventArgs)

Public Enum HotkeyModifiers As Integer
	''' <summary>Either ALT key must be held down.</summary>
	Alt = &H1
	''' <summary>Either CTRL key must be held down.</summary>
	Control = &H2
	''' <summary>Either SHIFT key must be held down.</summary>
	Shift = &H4
	''' <summary>Either WINDOWS key was held down. These keys are labeled with the Windows logo. Keyboard shortcuts that involve the WINDOWS key are reserved for use by the operating system.</summary>
	Windows = &H8
	''' <summary>Changes the hotkey behavior so that the keyboard auto-repeat does not yield multiple hotkey notifications.</summary>
	NoRepeat = &H4000
End Enum

Public Class Hotkey

	''' <summary>
	''' Raised when the user presses a hot key registered by the HotKey.Register method.
	''' </summary>
	Public Event HotkeyPressed As HotkeyPressedEventHandler

	Private Shared _idCount As Integer

	Private _filter As HotkeyMessageFilter
	Private _keyCode As Keys
	Private _modifiers As HotkeyModifiers
	Private _id As Integer

	Private Sub New()
		Me._filter = New HotkeyMessageFilter(Me)
		Application.AddMessageFilter(Me._filter)
	End Sub

	Protected Overrides Sub Finalize()
		Me.Unregister()
		MyBase.Finalize()
	End Sub

	''' <summary>
	''' Defines a system-wide hot key.
	''' </summary>
	''' <param name="modifiers">The keys that must be pressed in combination with the key specified by the keyCode parameter in order to generate the HotkeyPressed event. The modifiers parameter can be a combination of the HotkeyModifiers values.</param>
	''' <param name="keyCode">The virtual-key code of the hot key. See Keys.</param>
	''' <returns>A system-wide hot key.</returns>
	''' <remarks>
	''' When a key is pressed, the system looks for a match against all hot keys. Upon finding a match, the system posts the WM_HOTKEY message to the thread associated with the hot key.
	''' This function cannot associate a hot key with a window created by another thread.
	''' RegisterHotKey fails if the keystrokes specified for the hot key have already been registered by another hot key.
	''' </remarks>
	Public Shared Function Register(ByVal modifiers As HotkeyModifiers, ByVal keyCode As Keys) As Hotkey
		_idCount += 1
		If Not NativeMethods.RegisterHotKey(IntPtr.Zero, _idCount, modifiers, keyCode) Then
			Throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error())
		End If
		Return New Hotkey() With {._id = _idCount, ._keyCode = keyCode, ._modifiers = modifiers}
	End Function

	''' <summary>
	''' Frees a hot key previously registered by the calling thread.
	''' </summary>
	Public Sub Unregister()
		If Me._filter IsNot Nothing Then
			Application.RemoveMessageFilter(Me._filter)
			Me._filter = Nothing
		End If
		If Not Me._id = 0 Then
			If Not NativeMethods.UnregisterHotKey(IntPtr.Zero, Me._id) Then
				Throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error())
			End If
			Me._id = 0
		End If
	End Sub

	''' <summary>
	''' The virtual-key code of the hot key.
	''' </summary>
	Public ReadOnly Property KeyCode() As Keys
		Get
			Return Me._keyCode
		End Get
	End Property

	''' <summary>
	''' The modifier keys of the hot key.
	''' </summary>
	Public ReadOnly Property Modifiers() As HotkeyModifiers
		Get
			Return Me._modifiers
		End Get
	End Property

	Private Sub [RaiseEvent](ByVal modifiers As HotkeyModifiers)
		RaiseEvent HotkeyPressed(Me, New HotkeyPressedEventArgs(modifiers))
	End Sub

	Private Class NativeMethods

		Private Const USER32_DLL As String = "User32.dll"

		' [url]http://msdn.microsof...46309.aspx[/url]
		'BOOL WINAPI RegisterHotKey(
		'  __in_opt  HWND hWnd,
		'  __in	  int id,
		'  __in	  UINT fsModifiers,
		'  __in	  UINT vk
		');
		<DllImport(USER32_DLL, SetLastError:=True)> _
		Friend Shared Function RegisterHotKey( _
			ByVal hWnd As IntPtr, _
			ByVal id As Integer, _
			ByVal fsModifiers As HotkeyModifiers, _
			ByVal vk As Keys _
			) As <MarshalAs(UnmanagedType.Bool)> Boolean
		End Function

		'BOOL WINAPI UnregisterHotKey(
		'  __in_opt  HWND hWnd,
		'  __in	  int id
		');
		<DllImport(USER32_DLL, SetLastError:=True)> _
		Friend Shared Function UnregisterHotKey( _
			ByVal hWnd As IntPtr, _
			ByVal id As Integer _
			) As <MarshalAs(UnmanagedType.Bool)> Boolean
		End Function
	End Class

	Private Class HotkeyMessageFilter
		Implements IMessageFilter

		Private _parent As Hotkey

		Friend Sub New(ByVal parent As Hotkey)
			Me._parent = parent
		End Sub

		Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage
			Select Case m.Msg
				Case &H312 ' WM_HOTKEY
					If m.WParam.ToInt32() = Me._parent._id Then
						Dim modifiers As HotkeyModifiers = DirectCast([Enum].ToObject(GetType(HotkeyModifiers), m.WParam.ToInt32()), HotkeyModifiers)
						Me._parent.RaiseEvent(modifiers)
						Return True
					End If
			End Select
			Return False
		End Function

	End Class

End Class


Als we nu ons project testen zou men dit scherm ongeveer zien:

Geplaatste afbeelding

Even vertaald wat erin staat, voor diegene die geen/nauwelijks engels zouden lezen:
Klik mij om applicatie onzichtbaar te maken en druk dan CONTROL+ALT+O

Natuurlijk kan ik dit niet verder aan jullie laten zien hoe het verloop is want een foto van iets tonen dat er niet is gaat niet :)

Download pdf
Geplaatste afbeelding

Inloggen


Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)