2016-02-01 1 views
0

Я пытаюсь реализовать глобальные горячие клавиши (активированные даже без фокуса на форме) в WPF, но используя VB.NET. Есть много примеров использования C#, но я пробовал несколько часов, чтобы преобразовать их и не смог заставить что-либо работать.WPF - Назначение глобальных горячих клавиш в VB.NET

я, чтобы они работают в WinForms, используя RegisterHotkey но нет WNDPROC больше в WPF ...

В основном я просто хочу, горячие клавиши, такие как Alt + A для запуска Private Sub в моем коде позади.

Если бы кто-нибудь мог с этим помочь, было бы весьма полезно.

Спасибо, Уолли

+0

Возможный дубликат http://stackoverflow.com/questions/2450373/set-global-hotkeys-using-c-sharp? – Kelly

ответ

1

нет WNDPROC больше в WPF ...

На самом деле, there is;)

Для глобальных сочетаний клавиш, вы можете использовать мой NHotkey library, который имеет привязки для WPF и WinForms. Примеры приведены на C#, но вы можете легко преобразовать их в VB.NET.

+0

Привет, большое спасибо за ваш ответ. Я уже пробовал вашу библиотеку NHotkey, но не смог заставить ее работать, но, похоже, я сдался слишком рано. Я попробовал это снова, но я получил ошибку «Ошибка Аргумент не указан для параметра 'sender' of 'Частная функция OnIncrement (отправитель As Object, e As NHotkey.HotkeyEventArgs) Как объект'." Как и для e ..... –

+0

@WallyCloud, я не понимаю, что означает сообщение об ошибке в этом случае, но это должно быть 'Sub', а не' Function' –

+0

Hey Thomas, спасибо за вашу помощь , Я должен был иметь функцию, иначе она выдавала бы ошибку «Не возвращает значение». Я также попытался использовать ключ-ключ для xaml «HotkeyManager.RegisterGlobalHotkey, но он будет регистрироваться только тогда, когда форма была в фокусе. Возможно, проблема с тем, как я настраивал свои команды. Но все равно :) Мне удалось найти решение. Спасибо! –

0

Хорошо, я сделал это! Добавление глобальной горячей клавиши с использованием WPF и VB.NET может быть сделано путем добавления этих ссылок (Mainwindow.xmal.vb):

Imports System.Runtime.InteropServices 
Imports System.Windows.Interop 

Затем добавив следующий Кодекс за:

<DllImport("User32.dll")> _ 
Private Shared Function RegisterHotKey(<[In]> hWnd As IntPtr, <[In]> id As Integer, <[In]> fsModifiers As UInteger, <[In]> vk As UInteger) As Boolean 
End Function 

<DllImport("User32.dll")> _ 
Private Shared Function UnregisterHotKey(<[In]> hWnd As IntPtr, <[In]> id As Integer) As Boolean 
End Function 

Private _source As HwndSource 
Private Const HOTKEY_ID As Integer = 9000 

Protected Overrides Sub OnSourceInitialized(e As EventArgs) 
    MyBase.OnSourceInitialized(e) 
    Dim helper = New WindowInteropHelper(Me) 
    _source = HwndSource.FromHwnd(helper.Handle) 
    _source.AddHook(AddressOf HwndHook) 
    RegisterHotKey() 
End Sub 

Protected Overrides Sub OnClosed(e As EventArgs) 
    _source.RemoveHook(AddressOf HwndHook) 
    _source = Nothing 
    UnregisterHotKey() 
    MyBase.OnClosed(e) 
End Sub 

Private Sub RegisterHotKey() 
    Dim helper = New WindowInteropHelper(Me) 
    Const VK_F10 As UInteger = &H79 
    Const MOD_CTRL As UInteger = &H2 
    ' handle error 
    If Not RegisterHotKey(helper.Handle, HOTKEY_ID, MOD_CTRL, VK_F10) Then 
    End If 
End Sub 

Private Sub UnregisterHotKey() 
    Dim helper = New WindowInteropHelper(Me) 
    UnregisterHotKey(helper.Handle, HOTKEY_ID) 
End Sub 

Private Function HwndHook(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr 
    Const WM_HOTKEY As Integer = &H312 
    Select Case msg 
     Case WM_HOTKEY 
      Select Case wParam.ToInt32() 
       Case HOTKEY_ID 
        OnHotKeyPressed() 
        handled = True 
        Exit Select 
      End Select 
      Exit Select 
    End Select 
    Return IntPtr.Zero 
End Function 

Private Sub OnHotKeyPressed() 
    MsgBox("Hello world!") 
End Sub 

Это для Ctrl + F10. Его можно изменить, изменив следующее в соответствии с Keycodes от here и модификаторами Key от here. Просто замените 0x с & H.

Const VK_F10 As UInteger = &H79 
    Const MOD_CTRL As UInteger = &H2 

Надежда это помогает кому-то. Кредит переходит на «макс», из которого код был преобразован: Global hotkeys in WPF working from every window