Каталог решений - Иерархия окон в 1С 8.2

Иерархия окон в 1С 8.2

Иерархия окон в 1С 8.2

В наличии

Результаты первоначального исследования окон 8.2.

Категория:

Описание

Для работы с окнами 1С необходимы следующие хэндлы окон:
1. h1C – хэндл главного окна
2. hMDI – хэндл окна MDI (для 8.2 неактуально)
3. hReport — хэндл окна активной формы отчета (обработки)
4. hReportDialog — хэндл «подложки» (слой, куда можно поместить видимые компоненты)

Главное окно 8.2 имеет класс V8TopLevelFrameSDI, для вызывающей библиотеки может быть найдено как окно данного класса (с условием, что PID этого окна равен PID библиотеки, т.к. они принадлежат одному процессу)

function EnumWindows82Proc(WND: hwnd; LPARAM: lParam): bool; stdcall;
var ThrID, PID: DWORD;
var b:array[0..254] of AnsiChar;
begin
  ThrID := GetWindowThreadProcessId(wnd, PID);
  GetClassName(wnd,@b,255);

  {ищем только «своё» главное окно}
  if (b=’V8TopLevelFrameSDI’) and (PID=GetCurrentProcessId()) then begin
  Main82Handle:=wnd;
  end;
end;

function TMiracleClass.GetMain82: Integer;
begin
  Main82Handle:=0;
  EnumWindows(@EnumWindows82Proc, 0);
  RESULT:=Main82Handle;
end;
Примечание: для сторонней программы главное окно можно найти через
FindWindow(‘V8TopLevelFrameSDI’,nil) – самое верхнее
или
FindWindow(‘V8TopLevelFrameSDI’,ЗаголовокЭтогоОкна)

Формы 8.2 хоть и принадлежат процессу главного окна, но не являются его дочками, а являются окнами верхнего уровня. Окна имеют класс V8TopLevelFrameSDIsec
Для вызывающей библиотеки хэндл формы можно найти через GetActiveWindow, со стороны через 
FindWindow(‘V8TopLevelFrameSDIsec’,nil) – активная
или
FindWindow(‘V8TopLevelFrameSDIsec’,ЗаголовокНужнойФормы)
А вот дальше начинается весьма запутанная иерархия дочерних окон активной формы.
Методом научного тыка (кстати, удобный — рекомендую[//sale.itcity.ru/public/59436/index.php?fimages=yes&PAGEN_1=7#comm], пост 124) был определен хэндл «подложки», как раз тот слой, где внедренные компоненты видимы на форме
wnd:=FindWindow(‘V8TopLevelFrameSDIsec’,nil); // найдется активная форма
wnd:=GetTopWindow(wnd);// первый V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement
w:=FindWindowEx(wnd,0,’V8LayouterTabsWindow’,nil);// его первый V8LayouterTabsWindow
wnd:=FindWindowEx(wnd,w,’V8LayouterTabsWindow’,nil); //его второй V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement
wnd:=GetTopWindow(wnd);// его первый V8LayouterTabsWindow
wnd:=GetTopWindow(wnd);// его первый V8FormElement — он самый!!!!
{внедряем компонент дельфи}
PB:=TProgressBar.CreateParented(wnd);
PB.UpdateControlState;
PB.Left:=10;
PB.Top:=40;
PB.Width:=200;
PB.Height:=20;
PB.Visible:=true;
PB.Enabled:=true;
PB.Position:=60;
(результат на картинке)

has been added to your cart:
Оформление заказа