2013-08-02 2 views
0

Я преобразовываю свой проект winforms в WPF, а также изучаю WPF, пока я это делаю.WPF VB.NET WM_APPCOMMAND

я столкнулся с проблемой с этим кодом

Этот код определяет кнопки нажаты на медиа-клавиатуре или Media Center пульт дистанционного управления.

Protected Overrides Sub WndProc(ByRef msg As Message) 
    If msg.Msg = &H319 Then 
     ' WM_APPCOMMAND message 
     ' extract cmd from LPARAM (as GET_APPCOMMAND_LPARAM macro does) 
     Dim cmd As Integer = CInt(CUInt(msg.LParam) >> 16 And Not &HF000) 
     Select Case cmd 
      Case 13 
       MessageBox.Show("Stop Button") 
       Exit Select 
      Case 47 
       MessageBox.Show("Pause Button") 
       Exit Select 
      Case 46 
       MessageBox.Show("Play Button") 
       Exit Select 
     End Select 
    End If 
    MyBase.WndProc(msg) 
end sub 

Мне было интересно, есть ли способ заставить его работать в WPF или, возможно, сделать что-то подобное.

Редактировать

Моя последняя попытка, я попытался преобразовать его из C#, так что, возможно, будет неправильно. (Это просто падает мое приложение)

Dim src As HwndSource = HwndSource.FromHwnd(New WindowInteropHelper(Me).Handle) 
src.AddHook(New HwndSourceHook(AddressOf WndProc)) 

и

Public Function WndProc(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr 

'Do something here 
If msg = "WM_APPCOMMAND" Then 
MessageBox.Show("dd") 
End If 

Return IntPtr.Zero 
End Function 

Am я на правильном пути, или я далеко?

+0

Итак, вы хотите, чтобы переопределить WndProc в приложении WPF? –

+0

Да, если нет более легкого способа захвата мультимедийных клавиш. – Mattigins

+0

Возможный дубликат [Как обрабатывать сообщения WndProc в WPF?] (Http://stackoverflow.com/questions/624367/how-to-handle-wndproc-messages-in-wpf) –

ответ

3

процедура Ваше окно неправильно:

Public Function WndProc(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr 

    'Do something here 
    If msg = "WM_APPCOMMAND" Then 
     MessageBox.Show("dd") 
    End If 

    Return IntPtr.Zero 
End Function 

Обратите внимание, что параметр msg является Integer, а не строка. Это должно быть, давая вам ошибку времени компиляции, поэтому я не знаю, что вы имеете в виду в этом случае сбой вашего приложения.

Вам нужны заголовочные файлы Windows, чтобы узнать идентификатор сообщения WM_APPCOMMAND, или они иногда приводятся в документации. В этом случае it is. Значение равно &H0319 (в нотации VB).

Так изменить код, чтобы выглядеть следующим образом:

Private Const WM_APPCOMMAND As Integer = &H0319 

Public Function WndProc(hwnd As IntPtr, msg As Integer, wParam As IntPtr, lParam As IntPtr, ByRef handled As Boolean) As IntPtr 

    ' Check if the message is one you want to handle 
    If msg = WM_APPCOMMAND Then 
     ' Handle the message as desired 
     MessageBox.Show("dd") 

     ' Indicate that you processed this message 
     handled = True 
    End If 

    Return IntPtr.Zero 
End Function 
+0

Большое спасибо, он отлично работает.Все, что мне нужно было добавить, было «Dim cmd As Integer = CInt (CUInt (lParam) >> 16 And Not & HF000), и он работает так, как раньше. – Mattigins