Советы по 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;

... implementation USES ShellApi;
{$R *.DFM}

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

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

[000650]



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