Как правильно добавить кнопку "О программе" в системное меню?
Я пытаюсь добавить кнопку "О программе" в системное меню моего приложения, но код, который я обнаружил, выдает ошибку -
Не удалось найти точку входа с именем "AppendMenu" в DLL "user32".
Интересно, мог бы кто-нибудь взглянуть на код и посоветовать, что мне нужно сделать, чтобы это исправить? Благодарю.
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr
Private Declare Function AppendMenu Lib "user32" (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 Sub AddSysMenuItems()
'Get the System Menus Handle.
Dim hSysMenu As IntPtr = GetSystemMenu(Me.Handle, False)
'Add a standard Separator Item.
AppendMenu(hSysMenu, MF_SEPARATOR, 1000, Nothing)
'Add an About Menu Item.
AppendMenu(hSysMenu, MF_STRING, 1001, "About")
End Sub
1 ответ
Что ж, сообщение точное, в user32.dll нет точки входа с именем "AppendMenu". На самом деле у него есть две версии. Один называется AppendMenuA, A означает Ansi. Устаревшая версия, которая использует 8-битные кодированные строки, обычно используемые в старых программах на Си. И AppendMenuW, W означает Широкий. Он принимает строку Unicode, как и все функции winapi в современных версиях Windows.
Ваш оператор объявления старого стиля использует устаревшую функцию. Вы должны использовать ключевое слово Alias, чтобы дать правильное имя точки входа:
Private Declare Function AppendMenu Lib "user32.dll" Alias "AppendMenuA" (ByVal hMenu As IntPtr, ByVal uFlags As Int32, ByVal uIDNewItem As IntPtr, ByVal lpNewItem As String) As Boolean
Или просто назовите это AppendMenuA. Использование устаревшей функции не очень красиво, хотя у него не будет проблем с преобразованием "About" в Unicode. Но вы предпочитаете современный способ объявления функций pinvoke, он имеет много преимуществ, помимо автоматического сопоставления с версией A или W:
Imports System.Runtime.InteropServices
Imports System.ComponentModel
...
<DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function AppendMenu(ByVal hMenu As IntPtr, ByVal uFlags As Int32, ByVal uIDNewItem As IntPtr, ByVal lpNewItem As String) As Boolean
End Function
...
If Not AppendMenu(hSysMenu, MF_STRING, IntPtr.Zero, "About") Then
Throw New Win32Exception()
End If