Готовые проекты на VB6

Тема в разделе "VB", создана пользователем Thetrik, 6 дек 2016.

  1. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Здесь планируется выкладывать готовые проекты написанные на VB6, с кратким описанием. Если проект большой (описание не помещается в лимит одного сообщения), то нужно создать новую тему, а сюда указать ссылку с кратким описанием. Тоже самое если проект оформлен как статья.
     
    Mikl___ нравится это.
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    3D ёлка на рабочий стол
    Процедурно-генерируемая ёлка с множеством регулируемых параметров. Для работы нужна dx8vb.dll (внутри архива, положить в папку с программой). Выход по двойному клику. С наступающим новым годом!
     

    Вложения:

    • 3DFirTree.zip
      Размер файла:
      526,3 КБ
      Просмотров:
      1.806
    al79 и Mikl___ нравится это.
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Круговой визуализатор спектра
    Представляю исходный код и скомпилированную программу графического визуализатора звукового спектра. Звук анализируется через стандартное устройство записи Windows, т.е. можно выбрать микрофон и просматривать спектр с него, либо выбрать стереомикшер и просматривать спектр воспроизводимого звука. В данном визуализаторе имеется возможность регулировки количества отображаемых октав, регулировка прозрачности фона, усиления. Также имеется возможность загрузки палитры из внешних файлов формата PNG в формате 32ARGB, эффекты затухания "размытие" и "горение". Данный визуализатор позволяет просматривать спектр в двух режимах, в виде дуг (колец) и в виде секторов. В первом виде радиальная координата отвечает за частоту по октавам, угловая - между октавами. Гармоники отстоящие от друг друга на октавы, находятся по одну линию, цвет - интенсивность. Во втором режиме, радиальная координата - уровень громкости, цвет - частота, угловая координата - частота (период - 1 октава). Данную идею мне предложил Владислав Петровкий aka Хакер, только в его задумке немного по другому должен был отображаться спектр в виде кривой, я сделал в виде секторов.
     

    Вложения:

    Levi.S и Mikl___ нравится это.
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Фрактал Julia.
    Мне очень нравятся фракталы и фрактальные множества. Написал несколько тестовых программ, где можно генерировать и менять параметры у разных фракталов. В этом примере можно генерировать множество Жюлиа а также менять все параметры генерации (в том числе загружать палитру из картинок). Чтобы программа не подвисала, я генерацию и отрисовку засунул в другой поток. Пример не работает в IDE, работает только в скомпилированном виде.
     

    Вложения:

    Mikl___ нравится это.
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    4d гиперкуб (тессеракт)
    У меня всегда вызывали интерес четырехмерные фигуры, и вообще многомерные пространства. Решил написать небольшую програмку где можно покрутить 4-хмерный гиперкуб в 4-хмерном простанстве в 6-ти плоскостях. В принципе, таких программ много, но я решил написать на любимом VB6, к тому же, с небольшой доработкой можно сделать и другие фигуры.
    Куб состоит из 6-ти граней, квадратов. Т.к. отрисовка идет линиями, вполне можно рисовать 4 грани, аналогично и гипеперкуб, можно нарисовать всего 4-куба, а не все 8, остальные будут состоять из примыкающих граней этих фигур.
    Для наглядности, на вершинах гиперкуба я сделал окружности, цвет и размер которых соостветствует Т координате (меньше и темнее - дальше по оси Т).
    [​IMG]
     

    Вложения:

    • Tesseract.zip
      Размер файла:
      17,6 КБ
      Просмотров:
      1.245
    Mokil57 и Mikl___ нравится это.
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    FM-синтезатор на VB6 (Trick FM)
    Как-то давно занимался изучением синтеза звука, в частности FM (частотная модуляция) методом. Была написана тестовая программка-синтезатор. Сегодня я ее подправил немного, сделал GUI и т.п.
    Характеристики:
    • 6 осцилляторов
    • 6 форм волн
    • ADSR огибающая для каждого осциллятора
    • Модуляционная матрица 6x6 + 6 для вывода звука.
    • Гейт на 16 частей с регулировкой жесткости
    В общем полноценный FM синтезатор.
    Клавиши:
    Z-C5
    S-C#5
    X-D5
    D-D#5
    C-E5
    V-F
    и т.д
    Q-C6
    I-C7
    Для работы нужна библиотека dx8vb.dll
     

    Вложения:

    • TrickFM.zip
      Размер файла:
      143,5 КБ
      Просмотров:
      1.334
    Mikl___ и Alexey нравится это.
  7. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Создание GIF-анимации с прозрачным фоном на VB6
    Максимальный размер картинок 640х640. В принципе для анимаций без прозрачного фона, а также анимаций с ColorKey цветом прозрачности эта задача очень просто решается с помощью библиотеки GDI+, но у нее, как я выяснил при написании этой тестовой программы, есть недостаток - она не позволяет задать свойство восстановления фона анимации, по крайней мере в MSDN про это ни слова. Это проявляется в виде неприятного наложения кадров друг на друга, когда фон непрозрачен - это не заметно. Для предотвращения этого явления, я решил вручную находить нужные байты и править их "руками". В своем примере я также вычисляю оптимальную палитру с помощью октодерева, поэтому качество получаемых GIF-анимаций получается довольно-таки хорошим. Также имеется возможность настройки каждого кадра (длительность, порог прозрачности) и счетчика повторов. Для отключения прозрачности достаточно в поле Threshold выставить 0, чем выше значение в этом поле, тем больше полупрозрачных пикселей станут полностью прозрачными. Пример я хорошо прокомментировал , особенно в местах, где идет преобразование и сохранение.

    Тестировалось на Win7 x64. На WinXP - не работает сохранение.
    [​IMG]
    [​IMG]
     

    Вложения:

    al79 нравится это.
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Library info 2
    Проект который позволяет просматривать некоторую информацию о 32 битных PE файлах, а именно:
    • Export;
    • Import;
    • Delay import;
    Для библиотек типов и PE файлов содержащих библиотеки типов внутри:
    1. Interfaces;
    2. CoClasses;
    3. Types;
    4. Enumerations;
    5. Aliases.
    Для компиляции нужна библиотека Edanmo's OLE interfaces & functions (olelib.tlb) (конечный EXE не требует ее).
    [​IMG]
     

    Вложения:

    alix нравится это.
  9. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    "Линза" на VB6
    С помощью этой простой программы можно просматривать под увеличением определенный участок экрана, увеличение можно изменять колесиком, выход - ESC.
     

    Вложения:

    • Lens.zip
      Размер файла:
      9,3 КБ
      Просмотров:
      1.144
  10. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Наглядный пример FM (PM) синтеза на VB6
    Наглядный пример FM (PM) синтеза, форму волны можно визуально наблюдать. Регулятором Tone добейтесь "стабильной" картинки и регулируйте параметры. Элементы матрицы регулируются зажатием и перемещением мыши в соответствующем текстбоксе. Для работы нужен dx8vb.dll
    [​IMG]
     

    Вложения:

  11. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Всем привет!
    Сегодня я хотел бы поговорить о криптографии. Я сделал пример использования специальной криптографии - стеганографии. Этот метод скрывает сам факт шифрования данных. Существует множество видов стеганографии. Я бы хотел поговорить о LBS-методе, в котором данные скрываются в младших битах аудио данных. Это выглядит так, как-будто пользователи обмениваются аудио файлами, но на самом деле они обмениваются секретными данными. Тот кто не знает об этом методе не будет даже подозревать о обмене секретными данными. В некоторых случаях это может быть очень полезно.
    Как это работает?
    WAVE-PCM файл (без компрессии) содержит аудио данные. На самом деле звук является аналоговым событием, т.е. непрерывным. Для того чтобы перевести его в цифровую форму нужно проквантовать его с некоторыми потерями. Этот процесс характеризуется двумя параметрами: разрядностью и частотой дискретизации. Разрядность влияет на то как много уровней сигнала может содержаться в каждом семпле. Частота дискретизации влияет на то какая максимальная частота может содержатся в аудиоданных:
    [​IMG]
    В нашем случае нас интересует только разрядность аудиоданных. Она может быть 32, 24, 16, ... бит на семпл. Главная идея стеганографии (в нашем случае) - переписать младшие биты аудиоданных. Чем больше бит мы будем использовать, тем сильнее будут искажения.
    Наглядно:
    [​IMG]
    Как видно из рисунка метод сохраняет все шифруемые данные в определенных битах аудиоданных (в данном случае 4 бита на каждый семпл). Также заметьте что для сохранения данных нужно использовать аудио файл бо́льший по размеру чем шифруемый файл. Для примера, если мы будем использовать 3 бита для кодирования, аудиофайл должен будет иметь размер как минимум в 16/3 раза больше чем кодируемый. Я говорю 16 потому что я использую 16 бит на семпл в моем примере.
    В прикрепленном примере я также сохраняю оригинальное имя файла. Формат данных наглядно:
    [​IMG]
    Когда происходит упаковка берется каждый байт из шифруемого файла. Затем извлекается необходимые биты из очередного байта, а также очищаются соответственные биты в аудиоданных. Далее эти биты устанавливаются посредством операции побитовое-ИЛИ. Для извлечения необходимых бит используются маски и сдвиги. Маски оставляют необходимые биты, а сдвиги размещают их в начале байта.
    Распаковка происходит с точностью наоборот. Извлекаются биты из аудио файла и собирается исходный файл. Спектр аудиофайла в зависимости от битности:
    [​IMG]
    Надеюсь что этот небольшой обзор будет полезным.
    Спасибо за внимание.
     

    Вложения:

  12. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Внедрение в чужой процесс на VB6 (без DLL)
    Всем известна утилита SPYXX. С помощью нее можно делать много чего интересного. В числе ее возможностей - просмотр сообщений отправленных окну и результаты их обработки. Я решил сделать что-то подобное только на VB6 (не в качестве создания программы типа SPYXX, а в качестве демонстрации возможности внедрения кода из VB6, так что функционал проги очень маленький). Как известно SPYXX делает это с помощью глобальных хуков, но мне была интересна идея внедрения без DLL (c DLL все гораздо проще можно сделать, у Рихтера описано как можно несколькими функциями внедрится в чужой код с помощью DLL) и я решил сделать немного по другому. В моем примере код вместе с оконной процедурой непосредственно копируется в АП нужного процесса и там запускается (работает только с 32 разрядными приложениями). Там я размещаю код, который устанавливает новую процедуру обработки сообщений, для окна и усыпляю поток. В новой процедуре, я всего лишь передаю параметры, которые получило чужое окно, моему окну (frmSpy), далее вызывается оригинальная процедура окна. Скажу сразу - передача осуществляется не самым эффективным способом, можно было сделать гораздо эффективнее напрямую работая с FileMapping'ом, либо асинхронно передавать 2 сообщения подряд. Но я не стал заморачиваться лишним кодом, т.к. моя конечная цель не эффективность. Отмена инъекции осуществляется пробуждением потока и завершению его естественным образом, после чего из своей программы я освобождаю ресурсы. Работу я проверял в отладчике все работает, как и задумывалось. Приведу здесь текст шеллкода:
    Код (Visual Basic):
    1. ' Данный код выполняется в АП чужого процесса, поэтому он не имеет понятия ни о каких глобальных или локальных переменных
    2. ' уровня этого модуля, единственная область памяти с которой он может работать передаеться ему указателем на структуру
    3. ' TrickThreadData, который в последствии сохраняется в свойстве окна 'pInject'. Вызов наших функций, ведет к перенапрвлению
    4. ' к соответствующим API функциям. Здесь выполняется код, который вообще не использует рантайм. Для использования функций
    5. ' рантайма (сейчас о функциях которые не требуют инициализацию контекста потока), нужно его предварительно загрузить, через
    6. ' LoadLibrary() и получить адреса функций через GetProcAddress(). Все символьные имена и переменные, нужно хранить в
    7. ' в выделенной для этого предварительно памяти. Так что обращение к любой глобальной переменной или константе
    8. ' (пример s$="VB6 best language") может вызвать ошибку доступа
    9.  
    10. ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    11. ' Процедура, выполняемая в чужом процессе, передаем ей указатель на данные
    12. Private Sub InjectionProc(Dat As TrickThreadData)
    13.     Dim lpOldProc As Long
    14.     ' Мы в чужом процессе ))
    15.     mySetProp Dat.SrcWnd, PropCur, Dat.AddrStructure                         ' Устанавливаем окну свойство с указателем на данные
    16.     lpOldProc = mySetWindowLong(Dat.SrcWnd, GWL_WNDPROC, Dat.AddrWindowProc) ' Устанавливаем окну новый оконный обработчик
    17.     ' Вместо нового адреса процедуры пишем старое
    18.     Dat.AddrWindowProc = lpOldProc
    19.     ' Замораживаем поток
    20.     myWaitForSingleObject Dat.EventHandle, INFINITE
    21.     ' Поток разморожен, значит надо возвращать все на место
    22.     mySetWindowLong Dat.SrcWnd, GWL_WNDPROC, Dat.AddrWindowProc
    23.     myRemoveProp Dat.SrcWnd, PropCur
    24.     ' Закрываем описатель события
    25.     myCloseHandle Dat.EventHandle
    26.     ' Все поток закончен, теперь Clear разморозится и очистит занимаемую память
    27. End Sub
    28.  
    29. ' Прцедуры вызова соответствующих API c помощью сплайсинга
    30. Private Function myCopyMemory(dst As TrickThreadData, ByVal src As Long, ByVal Length As Long) As Long
    31.     myCopyMemory = -1
    32. End Function
    33. Private Function myCopyMemory2(ByVal dst As Long, src As TrickThreadData, ByVal Length As Long) As Long
    34.     myCopyMemory2 = -2
    35. End Function
    36. Private Function mySetProp(ByVal hwnd As Long, ByRef Name As Currency, ByVal Value As Long) As Long
    37.     mySetProp = -3
    38. End Function
    39. Private Function myGetProp(ByVal hwnd As Long, ByRef Name As Currency) As Long
    40.     myGetProp = -4
    41. End Function
    42. Private Function myRemoveProp(ByVal hwnd As Long, ByRef Name As Currency) As Long
    43.     myRemoveProp = -5
    44. End Function
    45. Private Function mySetWindowLong(ByVal hwnd As Long, ByVal Index As Long, ByVal Data As Long) As Long
    46.     mySetWindowLong = -6
    47. End Function
    48. Private Function myWaitForSingleObject(ByVal hEvent As Long, ByVal Millisecond As Long) As Long
    49.     myWaitForSingleObject = -7
    50. End Function
    51. Private Function mySendMessage(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As COPYDATASTRUCT) As Long
    52.     mySendMessage = -8
    53. End Function
    54. Private Function myCallWindowProc(ByVal addr As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    55.     myCallWindowProc = -9
    56. End Function
    57. Private Function myCloseHandle(ByVal Handle As Long) As Long
    58.     myCloseHandle = -10
    59. End Function
    60. ' Оконная функция, которая будет работать в чужом процессе
    61. Private Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    62.     Dim lpDat As Long, Dat As TrickThreadData, CDS As COPYDATASTRUCT
    63.    
    64.     lpDat = myGetProp(hwnd, PropCur)
    65.  
    66.     myCopyMemory Dat, lpDat, Len(Dat)                   ' Копируем параметры
    67.    
    68.     ' Устанавливаем параметры сообщения
    69.     Dat.Msg.Msg = uMsg
    70.     Dat.Msg.wParam = wParam
    71.     Dat.Msg.lParam = lParam
    72.    
    73.     myCopyMemory2 lpDat, Dat, Len(Dat)                  ' Копируем параметры обратно
    74.    
    75.     CDS.cbData = Len(Dat.Msg)
    76.     CDS.lpData = lpDat + 20                             ' Смещение структуры MessageInfo, относительно данных
    77.    
    78.     ' Отправляем нашему окну уведомление
    79.     mySendMessage Dat.DesthWnd, WM_COPYDATA, hwnd, CDS
    80.    
    81.     ' Вызываем процедуру по умолчанию
    82.     WindowProc = myCallWindowProc(Dat.AddrWindowProc, hwnd, uMsg, wParam, lParam)
    83. End Function
    84. ' \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
    85. ' Эта функция также служит маркером конца функции и в процесс не копируется
    86. Private Function AddrOf(Value As Long) As Long
    87.     AddrOf = Value
    88. End Function
    При работе в другом процессе, вообще не используется рантайм, хотя можно его загрузить и использовать (про инициализацию контекста потока отдельно) его функции, массивы строки и т.п. Также возникает проблема работы с переменными, т.к. глобальных переменных "не существует", и соответственно обращение к любым таким переменным может оказаться фатальным для всего процесса. Для вызова API я использую сплайсинг "псевдофункций API", заменяю вызов на безусловный переход к нужной функции. Работа с переменными осуществляеться в выделенной для этого области. Для того чтобы ее сохранить я использую SetProp, т.к. из WindowProc я могу что-то идентифицировать только через hWnd. Если надо добавить еще какие-либо глобальные переменные, то можно в этой области выделить место под строки и т.п. (например для вызова LoadLibrary с нужным параметром). Если бы в VB была непосредственная работа с указателями (без VarPtr, GetMem и т.п. функций), то было намного проще. Можно делать сразу ассемблерный переходник и в нем можно узнать значения переменных переданных в поток без SetProp и CopyMemory, но это детали, кто захочет - тот сделает.
    [​IMG]
     

    Вложения:

    • MessageLog.zip
      Размер файла:
      25,2 КБ
      Просмотров:
      1.444
  13. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Запись данных в ресурсы своего EXE из "себя" VB6
    Бывают ситуации, когда хочется где-то сохранить данные после работы программы, но не хочется иметь внешних файлов-зависимостей, записей в реестре и т.п. Зато можно хранить данные в своем EXE, но Windows не позволяет писать в работающий EXE (NTFS потоки не рассматриваю), и любая попытка будет отвергнута с ошибкой ERROR_ACCESS_DENIED. Можно еще переименовать свой EXE файл и создать новую копию со старым именем и в нее уже писать данные, но это не так интересно ). Если процесс завершить, то можно из другого процесса уже в него спокойно записывать данные. Вот по этому пути я и решил пойти.
    В моем примере я запускаю cmd.exe в приостановленном состоянии, создаю код, который будет внедряться в него и изменять ресурсы нашего EXE, и запускаю его. В свою очередь тот код ждет завершения нашего процесса и по завершении переписывает нужные нам данные (мы их предварительно туда передали) и завершается:
    Код (ASM):
    1. ' Код на ассемблере (NASM)
    2.  
    3. '[BITS 32]
    4. '; ThreadProc
    5. 'mov esi,dword [esp+0x04]; ESI = &dat
    6. 'xor ebx,ebx             ; Const 0&
    7. 'push ebx                ; Dim hRes As Long
    8. 'push 0xFFFFFFFF         ; INFINITE
    9. 'push dword [esi+0x00]   ; dat.hParent
    10. 'call [esi+0x14]         ; WaitForSingleObject dat.hParent, INFINITE
    11. 'push dword [esi+0x00]   ; dat.hParent
    12. 'call [esi+0x18]         ; CloseHandle dat.hParent
    13. 'push ebx                ; False
    14. 'push dword [esi+0x04]   ; dat.lpFileName
    15. 'call [esi+0x1c]         ; BeginUpdateResource(dat.lpFileName, False)
    16. 'mov [esp],eax           ; hRes = eax
    17. 'test eax,eax            ; IF hRes=0
    18. 'je ExtProc              ; GoTo ExtProc
    19. 'push dword [esi+0x10]   ; dat.dwDataCount
    20. 'push dword [esi+0x0c]   ; dat.lpData
    21. 'push ebx                ; 0
    22. 'push dword [esi+0x08]   ; dat.lpRsrcName
    23. 'push 0x0000000a         ; RT_RCDATA
    24. 'push dword [esp+0x14]   ; hRes
    25. 'call [esi+0x20]         ; UpdateResource hRes, RT_RCDATA, dat.lpRsrcName, 0, ByVal dat.lpData, dat.dwDataCount
    26. 'push ebx                ; False
    27. 'push dword [esp+0x04]   ; hRes
    28. 'call [esi+0x24]         ; EndUpdateResource hRes, False
    29. 'ExtProc:
    30. 'push ebx                ; 0
    31. 'call [esi+0x28]         ; ExitProcess 0
    Дабы не мудрить с VB-шным кодом и ограничиться одной формой, я решил внедряемый код сделать на ассемблере, так и проще и меньше кода писать (исходник прилагаю). Т.к. код написан исключительно для ознакомления и тестирования в нем нет синхронизации (например можно запустить копию, прежде чем запишутся данные, или запустить несколько экземпляров), т.к. для примера она не нужна, по хорошему ее надо поставить, но это уже отдельный разговор.
     

    Вложения:

    • SaveToExe.zip
      Размер файла:
      5 КБ
      Просмотров:
      1.074
  14. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    MP3 -> WAV конвертер.
    Всем привет!
    Представляю простую реализацию конвертера MP3 файлов в WAV используя ACM.
    [​IMG]
     

    Вложения:

    • Mp3_to_wave.zip
      Размер файла:
      5,7 КБ
      Просмотров:
      1.069
    rococo795 нравится это.
  15. Levi.S

    Levi.S New Member

    Публикаций:
    0
    Регистрация:
    30 май 2020
    Сообщения:
    3
    Анатолий Анатольевич (Thetrik), здравствуйте!
    Благодарю Вас! Совершенно замечательный проект!
    У меня есть два вопроса:
    1. Я хочу этот проект переложить на VBA. Не возражаете ли Вы против этого?
    2. Если не возражаете, то второй вопрос - в листинге встречается конструкция "frmTest.hwnd". Интуитивно понимаю, что "hwnd" это шестнадцатеричный хэндл окна, в котором спектр живет. Не могу по коду найти точку, в которой этот хэндл рождается и наполняется содержанием. Расскажите, пожалуйста об этом.
    Спасибо!
     
  16. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Не возражаю, даже рад.

    hWnd - это хендл окна. В VB6 я использовал готовую форму. Для VBA можно, я думаю использовать UserForm, либо создать окно вручную через WinAPI.
     
  17. Levi.S

    Levi.S New Member

    Публикаций:
    0
    Регистрация:
    30 май 2020
    Сообщения:
    3
    Спасибо за ответ!

    Я попытался так сделать до того, как Вам написал. Проблемой оказалось то, что у формы VBA "UserForm" нет свойства hWnd. Такое свойство есть у объекта Application. Но я сомневаюсь в том, что Application.Hwnd получится использовать. Прошу Вас пояснить какая очередность создания объектов:
    1. окно через WinAPI, выполняет роль контейнера и предоставляет свойство hWnd;
    2. форма VBA "UserForm" размещается в окне (как-то их связать между собой нужно?)
    Или все это не правильно? Напишите, пожалуйста, если Вам не тяжело.
     
  18. Levi.S

    Levi.S New Member

    Публикаций:
    0
    Регистрация:
    30 май 2020
    Сообщения:
    3
    Другими словами, нужно создать конструкцию "frmTest.hwnd". В моем понимании это объект форма VBA "frmTest" с присущим свойством от другого объекта окна ОС "hwnd". Если этот вывод правильный, то не понимаю, как из того можно вывернуться.
     
  19. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Можно получить HWND UserForm, вот к примеру метод.
    Также можно создать простое немодальное окно через CreateDialogIndirectParam (функция вернет HWND).
    Просто оберни в класс логику.
     
    M0rg0t нравится это.
  20. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Thetrik, немного не в тему, но - как работает вб6 на новых 64 битных десятках? Нет ли тенденции к выпиливанию этой дллки (если мне не изменяет память, vb6 не развивается с 98 или какого года).