Я уже задавал вопрос на эту тему. Тогда сошлись на том, что без знания дескриптора получить имя класса невозможно.
Мне нужно получить имя класса меню. Для получения его дескриптора я написал следующий код:
Option Explicit
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function IsMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Sub Form_Load()
Dim hMenu As Long
Dim hSubMenu As Long
Dim lngRet As Long
Dim strClassName As String
hMenu = GetMenu(Me.hwnd)
If IsMenu(hMenu) = 0 Then
MsgBox "Incorrect hWnd", vbInformation
Exit Sub
End If
hSubMenu = GetSubMenu(hMenu, 0)
If IsMenu(hSubMenu) = 0 Then
MsgBox "Incorrect hWnd", vbInformation
Exit Sub
End If
'Дескриптор подменю получается, всё нормально. Но когда далее пытаюсь выполнить такой код:
Лучше MSDN читай. GetClassName требует hWnd(логический номер окна), а не hSubMenu(логический номер подменю). hWnd может иметь только окно, созданное с помощью CreateWindowEx, а hSubMenu создаётся с помощью CreateMenu + InsertMenuItem.
Т.е. окнонные функции не работают ни с чем другим кроме hWnd.
Функция, создающая окно, требует в себе одним из параметров имя класса окна. Либо уже известного (BUTTON, COMBOBOX, EDIT, LISTBOX ... и т.д.) либо созданного заранее оконного класса и зарегистрированного с помощью RegisterClassEx
А функкция CreateMenu вообще работает без параметров. Т.е. само понятие класс для него не предусмотрено.
Так как меню не поддерживает имена классов(в отличие от окна), то можешь просто узнать является ли твой дескриптор указателем на меню с помощью IsMenu.
Вобщем вывод: Для окон используются только оконные функции, а для меню только функции меню. Другие варианты не поддерживаются потому что окно и меню - это несовместимые между собой объекты.
Тогда вопрос №2: а как динамически создать пункт меню (вопрос, наверное, тупой - но всё же...)? CreateObject я использовать не могу, т.к. не знаю имени класса (VB.Menu не катит).