Идёт загрузка страницы...

htp://aptem.net.ru





Delphi 1

Имитация 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]