Вот рабочий vb.net порт исходного ответа :
Imports System.Runtime.InteropServices
Public NotInheritable Class KeyboardHook
Implements IDisposable
' Registers a hot key with Windows.
_
Private Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As UInteger, vk As UInteger) As Boolean
End Function
' Unregisters the hot key with Windows.
_
Private Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As Boolean
End Function
'''
''' Represents the window that is used internally to get the messages.
'''
Private Class Window
Inherits NativeWindow
Implements IDisposable
Private Shared WM_HOTKEY As Integer = &H312
Public Sub New()
' create the handle for the window.
Me.CreateHandle(New CreateParams())
End Sub
Public Event KeyPressed As EventHandler(Of KeyPressedEventArgs)
'''
''' Overridden to get the notifications.
'''
'''
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
' check if we got a hot key pressed.
If m.Msg = WM_HOTKEY Then
' get the keys.
Dim key As Keys = DirectCast((CInt(m.LParam) >> 16) And &HFFFF, Keys)
Dim modifier As ModifierKeys = DirectCast(CUInt(CInt(m.LParam) And &HFFFF), ModifierKeys)
' invoke the event to notify the parent.
RaiseEvent KeyPressed(Me, New KeyPressedEventArgs(modifier, key))
End If
End Sub
#Region " IDisposable Members"
Public Sub Dispose() Implements IDisposable.Dispose
Me.DestroyHandle()
End Sub
#End Region
End Class
Private _window As New Window()
Private _currentId As Integer
Public Sub New()
' register the event of the inner native window.
AddHandler _window.KeyPressed, Sub(sender As Object, args As KeyPressedEventArgs)
RaiseEvent KeyPressed(Me, args)
End Sub
End Sub
'''
''' Registers a hot key in the system.
'''
''' The modifiers that are associated with the hot key.
''' The key itself that is associated with the hot key.
Public Sub RegisterHotKey(modifier As ModifierKeys, key As Keys)
' increment the counter.
_currentId = _currentId + 1
' register the hot key.
If Not RegisterHotKey(_window.Handle, _currentId, DirectCast(modifier, UInteger), CUInt(key)) Then
'Throw New InvalidOperationException("Couldn’t register the hot key.")
'or use MsgBox("Couldn’t register the hot key.")
End If
End Sub
'''
''' A hot key has been pressed.
'''
Public Event KeyPressed As EventHandler(Of KeyPressedEventArgs)
#Region " IDisposable Members"
Public Sub Dispose() Implements IDisposable.Dispose
' unregister all the registered hot keys.
Dim i As Integer = _currentId
While i > 0
UnregisterHotKey(_window.Handle, i)
System.Math.Max(System.Threading.Interlocked.Decrement(i), i + 1)
End While
' dispose the inner native window.
_window.Dispose()
End Sub
#End Region
End Class
'''
''' Event Args for the event that is fired after the hot key has been pressed.
'''
Public Class KeyPressedEventArgs
Inherits EventArgs
Private _modifier As ModifierKeys
Private _key As Keys
Friend Sub New(modifier As ModifierKeys, key As Keys)
_modifier = modifier
_key = key
End Sub
Public ReadOnly Property Modifier() As ModifierKeys
Get
Return _modifier
End Get
End Property
Public ReadOnly Property Key() As Keys
Get
Return _key
End Get
End Property
End Class
'''
''' The enumeration of possible modifiers.
'''
_
Public Enum ModifierKeys As UInteger
Alt = 1
Control = 2
Shift = 4
Win = 8
End Enum
Задачи:
Application1
ниже именем вашего приложения (его можно увидеть как корень дерева в окне обозревателя Visual Studio) . AddGlobalHotkeySupport()
на этап инициализации вашего приложения. RemoveGlobalHotkeySupport()
на этап завершения вашего приложения. Код:
Public Sub AddGlobalHotkeySupport() 'TODO: call this at initialization of the application
' register the event that is fired after the key press.
AddHandler hook.KeyPressed, AddressOf hook_KeyPressed
' register the control + alt + F12 combination as hot key.
hook.RegisterHotKey(Application1.ModifierKeys.Control Or Application1.ModifierKeys.Alt, Keys.F12)
End Sub
Public Sub RemoveGlobalHotkeySupport() 'TODO: call this at finalization of the application
' unregister all registered hot keys.
hook.Dispose()
End Sub
Private Sub hook_KeyPressed(sender As Object, e As KeyPressedEventArgs)
' show the keys pressed in a label.
MsgBox(e.Modifier.ToString() + " + " + e.Key.ToString())
End Sub
Среди классических моделей «Gang of Four» довольно много специфических для языка. Другие, такие как Visitor, действительно полезны только в объектно-ориентированной настройке. Функциональный язык вместо [Visitor] имеет fold
(катаморфизм), и любой, кто пытается использовать Visitor на функциональном языке, будет рассматриваться как опасный сумасшедший. Наконец, существуют шаблоны, которые могут быть применены на любом языке, например Factory.
. Одна из причин, по которым я не являюсь большим поклонником движения шаблонов, как практикуется Гамма и др., Состоит в том, что представление о шаблоне не хватает интеллектуальной согласованности. «Любое полезное» является хорошим заявлением, но, как вы заметили, не дает большого указания относительно того, какие шаблоны могли бы по-прежнему быть полезными при изменении языка или парадигмы.
Для иллюстрации рисков, присущих классифицированию паттернов, проверьте одну из моих любимых коллекций: «Эффективные образцы практики» [k0] Smalltalk Kent Beck . Несмотря на работу «Smalltalk» в названии, многие программисты нашли эти шаблоны применимыми к таким языкам, как Java и Python.
Это должно дать прямой ответ.
С одной стороны некоторые шаблоны зависят от языка, шаблоны, такие как Factory, Strategy и Template, зависят от языковых механизмов, таких как полиморфизм и наследование.
С другой стороны, некоторые шаблоны существуют, потому что язык, который мы используем не имеет правильной функциональности (пример: шаблон посетителя используется для устранения недостатка двойной отправки на языках, таких как Java и C ++).
Шаблоны проектирования не являются специфическими для языка, хотя некоторые шаблоны более полезны на некоторых языках, чем другие.
Шаблоны проектирования сами по себе не являются языковыми, однако некоторые шаблоны могут быть специфичными для парадигмы, например, реализация одноэлементного шаблона в C не имеет смысла, поскольку вы можете просто написать простой старый модуль.
Однако шаблоны проектирования не являются специфичными для языка, но могут быть более полезными или иметь больше смысла в разных парадигмах (OO против структурированного и функционального)
Шаблоны проектирования, как правило, специфичны для конкретной парадигмы программирования. В той степени, в которой многие (большинство?) Языков поддерживают несколько парадигм, данный шаблон проектирования может применяться к совершенно разрозненным языкам.
Итак, что же такое шаблон, специфичный для языка? Шаблоны реализации часто называются идиомами . См. https://softwareengineering.stackexchange.com/questions/106815/difference-between-idiom-and-design-pattern .
Я думаю, что это зависит от того, какие функции языка доступны для вас, но нет, я бы не сказал, что шаблоны проектирования ограничены определенными языками.
Нет, это не так. Это абстракция, которая может быть применена к объектно-ориентированным языкам в целом.
Да и нет. Некоторые шаблоны проектирования не относятся к конкретным языкам, но могут быть шаблоны проектирования, характерные для классов языков.
Например, могут быть функциональные шаблоны проектирования, характерные для функциональных языков или объектно-ориентированных шаблонов проектирования к объектно-ориентированным языкам. Некоторое перекрытие может существовать, но это не 100%.
Шаблоны зависят от языков программирования, хотя и не так сильно, как предполагает ваш вопрос. Например, Iterator является шаблоном проектирования, однако на многих языках (C ++, Java, C #) он является частью языка (ОК, библиотека классов).
Существует несколько шаблонов, которые можно назвать Object Ориентированы, т. Е. Их трудно реализовать без надлежащих классов, наследования и полиморфизма. Примеры: абстрактный завод, стратегия, шаблонный метод. Однако даже это можно сделать, например, C, если кто-то действительно хотел. Это возможно, потому что C имеет указатели на функции. Мне было бы очень сложно, хотя бы представить реализацию вышеупомянутых шаблонов на языке без OO без указателя (или эквивалентной) поддержки. Опять же, я думаю, что эти шаблоны на самом деле не имеют смысла на таком языке ...
Большинство шаблонов не зависят от языка. Для некоторых шаблонов и языков требуется серьезный хакер. Например, Windows COM - странная реализация составного шаблона на языке C (не C ++).
Некоторые языки, такие как VB 6.0, вызывают основные препятствия, которые нужно перепрыгнуть, чтобы реализовать некоторые шаблоны, что делает его нецелесообразным.