Тема: EnumWindows возвращает Handle, помогите через Handle получить GUID

Функция WindowsAPI EnumWindows возвращает Handle
Вот пример работы функции EnumWindows:

'Add this code to a form
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Set the form's graphics mode to persistent
    Me.AutoRedraw = True
    'call the Enumwindows-function
    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub
'Add this code to a module
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim sSave As String, Ret As Long
    Ret = GetWindowTextLength(hwnd)
    sSave = Space(Ret)
    GetWindowText hwnd, sSave, Ret + 1
    Form1.Print Str$(hwnd) + " " + sSave
    'continue enumeration
    EnumWindowsProc = True
End Function

Помогите через Handle получить GUID приложения, которому принадлежит окно на пели задач.
Желательно напишите пример функции пожалуйста!
Для дополнительной информации посмотрите страницу: https://www.caduser.ru/forum/topic31260.html

Re: EnumWindows возвращает Handle, помогите через Handle получить GUID

> Миша
1) Далеко не у каждого приложения есть GUID.
2) Прямой взаимосвязи между HWND и GUID не существует.
3) В лучшем случае тебе удастся по HWND узнать имя exe-файла (путь к нему).
4) Как 3) сделать на VBA не знаю.

Re: EnumWindows возвращает Handle, помогите через Handle получить GUID

> Александр Ривилис
На конференции по адресу: http://www.rsdn.ru/Forum/Message.aspx?mid=2257073
мне предложили следующий способ получения пути к exe-шнику:

Можно, используя дескриптор окна, извлечь путь к exe-шнику.
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
   ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" ( _
   ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
   ByVal dwProcessId As Long) As Long
Private Const PROCESS_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Declare Function CloseHandle Lib "kernel32" ( _
   ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
   ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Const TH32CS_SNAPMODULE = &H8
Private Const MAX_PATH = 260
Private Const MAX_MODULE_NAME32 = 255
Private Type MODULEENTRY32
   dwSize As Long
   th32ModuleID As Long
   th32ProcessID As Long
   GlblcntUsage As Long
   ProccntUsage As Long
   modBaseAddr As Long
   modBaseSize As Long
   hModule As Long
   szModule(0 To MAX_MODULE_NAME32) As Byte
   szExePath(0 To MAX_PATH - 1) As Byte
End Type
Private Declare Function Module32First Lib "kernel32" ( _
  ByVal hSnapshot As Long, lpme As MODULEENTRY32) As Long
Private Const INVALID_HANDLE_VALUE As Long = -1&
Public Function GetExePathFromhWnd(ByVal hWnd As Long) As String
 Dim ProcessId As Long
 Dim hProcess As Long
 Dim hModuleSnap As Long
 Dim me32 As MODULEENTRY32
 Dim sExePath As String
 GetWindowThreadProcessId hWnd, ProcessId
 If ProcessId = 0 Then Exit Function
 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, ProcessId)
 If hProcess = 0 Then Exit Function
 hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId)
 If hModuleSnap = INVALID_HANDLE_VALUE Then CloseHandle hProcess: Exit Function
 me32.dwSize = LenB(me32)
 If Module32First(hModuleSnap, me32) Then
    sExePath = StrConv(me32.szExePath, vbUnicode)
    GetExePathFromhWnd = Left$(sExePath, InStr(sExePath, vbNullChar) - 1)
 End If
 CloseHandle hModuleSnap
 CloseHandle hProcess
End Function

Но мне всё равно надо получить GUID через Handle помогите пожалуйста это сделать!

Re: EnumWindows возвращает Handle, помогите через Handle получить GUID

> Миша
Как найти путь к приложению я давал Вам в прошлом вашем вопросе. Начнем про подгрузку Ваших библиотек. Вот Вам очередные мои варианты: не думаю, что библиотек у вас очень много. Грузите первую библиотеку, проделайте через нее операцию, которая может вызвать ошибку при не соответствии версии активного окна автокада. Отлавливаите ошибку при наличии, выгружайте библиотеку подгружаете нужную.
Также если Вы знаете путь к верхнему окну Автокада, можете прочесть свойства ехе файла, т.е. возможно там есть его версия. Дома не установлен ACAD, так что проверить предлогаю Вам. Зная версию сразу можно грузить библиотеку, ту, что Вам необходима.
p.s. При не обходимости покажу как узнать версию у исполняемого файла.
С НАСТУПАЮЩИМ ВСЕХ ПОСЕТИТЕЛЕЙ ФОРУМА.

Re: EnumWindows возвращает Handle, помогите через Handle получить GUID

> SmeL
Спасибо за поздравление, я тоже всех ПОЗДРАВЛЯЮ С наступающим НОВЫМ ГОДОМ!
По поводу присоединения библиотек:

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

Если подгрузить неправильную библиотеку, то код не компилируется и тогда вообще ничего не работает!

Re: EnumWindows возвращает Handle, помогите через Handle получить GUID

Миша пишет:

Если подгрузить неправильную библиотеку, то код не компилируется и тогда вообще ничего не работает!

Я думал Вы ее подгружаете программно, через

Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) _
   As Long

или

Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, _
   ByVal hFile As Long, _
   ByVal dwFlags As Long) _
   As Long