Советы по Delphi

       

Имитация Delphi IDE


Во-первых, необходимо проверить, загружена ли Delphi - используйте FindWindow для поиска окна с именем класса TAppBuilder. Если оно загружено, FindWindow вернет вам дескриптор. Если нет, выполняйте WinExec и снова используйте FindWindow для получения дескриптора.

Для получения доступа к главному меню Delphi используйте GetMenu. "Пробегитесь" по дереву меню до тех пор, пока не найдете желаемый пункт. После получения ID пункта меню, вы можете посылать сообщение WM_COMMAND, дающее тот же эффект, что и нажатие на этот пункт. Ниже приведен пример вышесказанного. Для его создания, расположите на новой форме панель, выровняйте ее по верху (свойство Align = alTop) и разместите на ней кнопку. Расположите на форме компонент outline и установите его свойство Align в alClient. Поместите на форме компонент OpenDialog и настройте его на открытие файлов с расширением .EXE. Затем используйте код, приведенный ниже. Данный пример запустит определенную вами программу и отобразит структуру ее меню в outline. Располагая идентификаторами пунктов (IDs) меню чужой программы (в нашем случае Delphi) в компоненте outline, вы запросто можете управлять этой программой. Или, что еще интереснее, вы можете "пробежаться" по меню, используя те же методы, и найти нужный ID во время выполнения программы. Кто знает, может новая версия Delphi будет содержать другие пункты (ID) меню.

...private{ Private declarations }InstHandle : Word;WndHandle : hWnd;function EnumFunc(H : HWnd) : Word;...implementationUSES ShellApi;
{$R *.DFM}

function TForm1.EnumFunc(H : HWnd) : Word;
BEGIN
IF
GetWindowWord(H, GWW_HINSTANCE) = InstHandle THENBEGINWndHandle := H;Result := 0;ENDELSE Result := 1;END;


procedure TForm1.Button1Click(Sender: TObject);
VAR
Cmd : ARRAY[0..255] OF Char;
procedure AddChildMenus(Loc, Han : Integer);VARMText : ARRAY[0..255] OF Char;N : Integer;ID : Word;NuLoc : Integer;BEGINFOR N := 0 TO GetMenuItemCount(Han)-1 DOBEGINId := GetMenuItemID(Han, N);GetMenuString(Han, N, MText, 255, MF_BYPOSITION);IF ID = $FFFF THENBEGINNuLoc := Outline1.AddChild(Loc, StrPas(MText));AddChildMenus(NuLoc, GetSubMenu(Han, N));ENDELSEOutline1.AddChild(Loc, StrPas(MText) + ' {' + IntToStr(Id) +'}');END;END;begin
WITH
OpenDialog1 DOIF Execute THENBEGINStrPCopy(Cmd, Filename);InstHandle := WinExec(Cmd, SW_SHOW);WndHandle := 0;IF InstHandle >= 32 THENEnumWindows(@TForm1.EnumFunc, LongInt(Self));IF WndHandle <> 0 THENBEGINSetWindowText(WndHandle, 'Title changed by KNOWEXEC');Outline1.Clear;Outline1.Add(0, 'menu');AddChildMenus(1, GetMenu(WndHandle));END;END;end;

[000650]



Содержание раздела