64-битное приложение + вне процесса 32-битный модальный диалог

Мы работаем над расширением плагина (панели инструментов) для стороннего приложения. Новая версия приложения также 64-битная - и тут возникает проблема. Наш плагин разработан под VB6. В 32битном приложении все отлично работает.

Производитель приложения также предоставляет оболочку (с 64-битной версией), которая автоматически запускается для 32-битных плагинов, поэтому наш плагин работает "вне процесса". Обычно это работает нормально, но для этого нужны (очевидно) некоторые необходимые обходные пути.

Наш плагин имеет только модальные формы. Когда он запускается "вне процесса" 64-битного приложения, необходимо установить владельца и родителя следующим образом

Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetLastActivePopup Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetParent Lib "user32" (ByVal hwndC As Long, ByVal hwndP As Long) As Long
Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Sub PopupWindow(formHwnd As Long)
  '(Declarations here...)
  If (App.GetProcessId() <> GetCurrentProcessId()) Then
    hWndMain = FindWindow(vbNullString, App.Caption)
    hWndParent = GetLastActivePopup(hWndMain)
    CurrentStyle = GetWindowLong(formHwnd, GWL_STYLE)

    If (hWndParent = 0) Then
      hWndParent = hWndMain
      BringWindowToTop hWndParent
      SetWindowLong formHwnd, GWL_STYLE, CurrentStyle Or WS_POPUP
      SetParent formHwnd, hWndMain
    Else
      SetWindowLong formHwnd, GWL_STYLE, CurrentStyle Or WS_POPUP
      SetWindowLong formHwnd, GWL_HWNDPARENT, hWndParent
    End If
  End If
End Sub

Код для отображения формы теперь:

PopupWindow formType.hwnd
formType.Show vbModal, [OwnerForm]

1) Первая небольшая проблема заключается в том, что нажатие на "родительское" окно приложения приводит к потере фокуса нашего окна из-за плагина (но окно плагина все еще находится сверху, а родительское приложение отключило элементы управления). В 32-битной версии он ведет себя стандартным образом - проигрывает "гудок" и фокусируется на модальном диалоговом окне - как это сделать на "вне процесса"?

В блоге The Old New Thing описана эта проблема (желтый прямоугольник), а затем решение, подобное

Когда вы вызываете DialogBox в процессе B, передайте hwndA в качестве окна владельца

Но в VB6 у вас есть функция Form.Show([Modal], [OwnerForm]), где OwnerForm означает тип, а не hWnd.

Тип формы Appliacation недоступен в ее интерфейсе. Я не могу найти решение с помощью WinAPI.

2) Вторая проблема (и я думаю, что причина та же) заключается в том, что когда я показал модальное диалоговое окно плагина, затем нажмите "Просмотр рабочего стола" (или Win+M), затем я вернусь в приложение (нажмите на иконку в панели), он играет только "Beep" и ничего не делать. (решение только убить приложение). Опять же, 32-битная версия работает нормально.

Спасибо за ответы и прошу прощения за мой английский. Да, я знаю, что VB6 больше не поддерживается, плагин только в режиме обслуживания, идет разработка новой версии на C#. Пока это не сделано, VB6 должен работать.


РЕДАКТИРОВАТЬ:

В Spy++ разница в свойствах окна между работой в 32-битном и 64-битном приложениях:

Различия стилей окон плагинов под 32-битным и 64-битным приложениями:

WS_CAPTION
*** WS_POPUP (only with 64bit App, because of code above)
WS_VISIBLE
WS_CLIPSBLINGS
WS_CLIPCHILDREN
WS_SYSMENU
WS_THICKFRAME
*** WS_OVERLAPPED (only with 32bit App)
WS_MINIMIZEBOX

Окно плагинов Различия между родителями и владельцами под 32-битным и 64-битным приложениями:

*** Parent Window (32bit App None, 64bit App - Main Application hWnd) 
Owner Window (32bit and 64bit App - Main Application hWnd)

0 ответов

Другие вопросы по тегам