2013-12-16 2 views
2

Мне удалось создать класс, который позволяет мне добавить кнопку «О ...» в Системное меню любой формы. Эта часть работает нормально, при этом кнопка добавляется событием load формы, но как обрабатывать клики этой кнопки? Благодарю.Ручка нажимает на пользовательские кнопки в системном меню

Вот как я добавляю кнопку -

Private Sub mainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    {More code....} 
    Dim SysMenu = New SystemMenu(Me) 
    {More code....} 

End Sub 

А вот SystemMenu класс -

Imports System.Windows.Forms 

Public Class SystemMenu 

    Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr 
    Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As IntPtr, ByVal uFlags As Int32, ByVal uIDNewItem As IntPtr, ByVal lpNewItem As String) As Boolean 
    Private Const MF_STRING As Integer = &H0 
    Private Const MF_SEPARATOR As Integer = &H800 

    Private m_hSysMenu As IntPtr 
    Private Property hSysMenu() As IntPtr 
     Get 
      Return Me.m_hSysMenu 
     End Get 
     Set(ByVal Value As IntPtr) 
      Me.m_hSysMenu = Value 
     End Set 
    End Property 

    '** 
    ' Constructor 
    '* 
    Protected Friend Sub New(ByRef Form As Form) 
     Me.hSysMenu = GetSystemMenu(Form.Handle, False) 
     AddAbout(Form) 
    End Sub 

    '** 
    ' Add an 'About' button to the system menu of the given form 
    '* 
    Private Sub AddAbout(ByRef Form As Form) 
     AppendMenu(Me.hSysMenu, MF_SEPARATOR, 1000, Nothing) 
     AppendMenu(Me.hSysMenu, MF_STRING, 1001, "About...") 
    End Sub 

End Class 
+0

http://www.codeproject.com/ Статьи/6122/Subclassed-System-Menu – Jeff

+0

Я нашел это раньше. Даже если включен параметр «Импорт System.Windows.Forms.NativeWindow», я все равно получаю ошибку «Тип» SubclassedSystemMenu не определен. «Спасибо. –

ответ

1

Check this out. Добавьте файл SubclassedSystemMenu.vb к проекту и добавить к вашей основной форме

Private WithEvents sysMenu As SubclassedSystemMenu 

Protected Overrides Sub OnLoad(e As System.EventArgs) 
    sysMenu = New SubclassedSystemMenu(Me.Handle.ToInt32, "&About...") 
End Sub 

А потом подписаться на его LaunchDialog события и открыть форму

Private Sub sysMenu_LaunchDialog() Handles sysMenu.LaunchDialog 
    Dim f as New frmAbout 
    f.ShowDialog(Me) 
End Sub 

А вот SubclassedSystemMenu класса

Public Class SubclassedSystemMenu 
Inherits System.Windows.Forms.NativeWindow 
Implements IDisposable 

Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Int32, _ 
                ByVal bRevert As Boolean) As Int32 

Private Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal hMenu As Int32, _ 
                     ByVal wFlags As Int32, _ 
                     ByVal wIDNewItem As Int32, _ 
                     ByVal lpNewItem As String) As Int32 

Private Const MF_STRING As Int32 = &H0  ' Menu string format 
Private Const MF_SEPARATOR As Int32 = &H800 ' Menu separator 
Private Const WM_SYSCOMMAND As Int32 = &H112 ' System menu 
Private Const ID_ABOUT As Int32 = 1000  ' Our ID for the new menu item 

Private mintSystemMenu As Int32 = 0     ' Parent system menu handle 
Private mintHandle As Int32 = 0      ' Local parent window handle 
Private mstrMenuItemText As String = String.Empty ' New menu item text 

Public Event LaunchDialog() 

Public Sub New(ByVal intWindowHandle As Int32, _ 
       ByVal strMenuItemText As String) 

    Me.AssignHandle(New IntPtr(intWindowHandle)) 

    mintHandle = intWindowHandle 
    mstrMenuItemText = strMenuItemText 

    ' Retrieve the system menu handle 
    mintSystemMenu = GetSystemMenu(mintHandle, 0) 

    If AddNewSystemMenuItem() = False Then 
     Throw New Exception("Unable to add new system menu items") 
    End If 

End Sub 

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

    Select Case m.Msg 
     Case WM_SYSCOMMAND 

      MyBase.WndProc(m) 

      If m.WParam.ToInt32 = ID_ABOUT Then 
       If mintSystemMenu <> 0 Then 
        RaiseEvent LaunchDialog() 
       End If 
      End If 

     Case Else 
      MyBase.WndProc(m) 
    End Select 

End Sub 

Public Sub Dispose() Implements System.IDisposable.Dispose 

    If Not Me.Handle.Equals(IntPtr.Zero) Then 
     Me.ReleaseHandle() 
    End If 

End Sub 

Private Function AddNewSystemMenuItem() As Boolean 
    Try 
     ' Append the extra system menu items 
     Return AppendToSystemMenu(mintSystemMenu, mstrMenuItemText) 

    Catch ex As Exception 
     Return False 
    End Try 
End Function 

Private Function AppendToSystemMenu(ByVal intHandle As Int32, _ 
            ByVal strText As String) As Boolean 

    Try 
     ' Add the seperator menu item 
     Dim intRet As Int32 = AppendMenu(intHandle, MF_SEPARATOR, 0, String.Empty) 

     ' Add the About... menu item 
     intRet = AppendMenu(intHandle, MF_STRING, ID_ABOUT, strText) 

     If intRet = 1 Then 
      Return True 
     Else 
      Return False 
     End If 

    Catch ex As Exception 
     Return False 
    End Try 
End Function 

Конец Класс

+0

Спасибо за код, но, как упоминалось в комментариях выше, я все еще получаю сообщение об ошибке - 'Type 'SubclassedSystemMenu' не определен.' Спасибо. –

+0

А ... пропустил это. Где вы получаете ошибку? Я просто добавил это к существующему проекту winforms. У меня нет ошибок. – Jeff

+0

. Я получаю сообщение об ошибке как «Private WithEvents sysMenu As SubclassedSystemMenu», так и 'sysMenu = New SubclassedSystemMenu ...». Я импортирую 'System.Windows.Forms.NativeWindow', поскольку в статье говорится, что я должен. Есть что-то еще, что мне не хватает? –

 Смежные вопросы

  • Нет связанных вопросов^_^