Как окружить к другому приложению и иметь его, появляются в форме Дельфи

Ваш кастинг и выбор неверного спецификатора формата вызывает неопределенное поведение. Используйте правильные спецификаторы формата в соответствии с типом переменной:

std::sscanf(test, ":CF%04" SCNx16 "%04" SCNx16 "%04" SCNx16,
                      &value1,     &value2,     &value3);
11
задан Brian Frost 28 April 2009 в 08:54
поделиться

2 ответа

Вся проверка ошибок пропущена, но с этого следует начать:

procedure TForm1.Button1Click(Sender: TObject);
var
  Rec: TShellExecuteInfo;
const
  AVerb = 'open';
  AParams = '';
  AFileName = 'Notepad.exe';
  ADir = '';
begin
  FillChar(Rec, SizeOf(Rec), #0);

  Rec.cbSize       := SizeOf(Rec);
  Rec.fMask        := SEE_MASK_NOCLOSEPROCESS;
  Rec.lpVerb       := PChar( AVerb );
  Rec.lpFile       := PChar( AfileName );
  Rec.lpParameters := PChar( AParams );
  Rec.lpDirectory  := PChar( Adir );
  Rec.nShow        := SW_HIDE;

  ShellExecuteEx(@Rec);
  WaitForInputIdle(Rec.hProcess, 5000);

  fNotepadHandle := Windows.FindWindow( 'Notepad', nil );
  Windows.SetParent( fNotepadHandle, Handle );

  Resize;
  ShowWindow(fNotepadHandle, SW_SHOW);
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  if IsWindow(fNotepadHandle) then begin
    SetWindowPos(fNotepadHandle, 0, 0, 0, ClientWidth, ClientHeight,
      SWP_ASYNCWINDOWPOS);
  end;
end;

Что вам определенно следует сделать, это перечислить окна нового процесса, а не просто использовать любой дескриптор окна, который FindWindow () возвращает.

16
ответ дан 3 December 2019 в 06:47
поделиться

Это будет сложно, если это вообще возможно.

Я видел подходы, которые будут работать для текстовых приложений - они обычно фиксируют стандартный вывод процесса, как он произойдет и поместит его в текстовый элемент управления.

Но вы говорите о полноценном графическом приложении (Блокнот, несмотря на работу с текстом, отображением пикселей, а не кодов символов).

Так что, если Блокнот не предоставляет интерфейс, где вы можете:

  • запрашивать произвольные символы в буфере; и
  • отправлять произвольные нажатия клавиш в программу, Я бы сказал, что вам просто не повезло.

Определенно, это клочок, но одним из вариантов является постоянный мониторинг окон Блокнота и обеспечение его постоянного наложения на область клиента форм. Это довольно ужасно, так как вы должны остановить его перемещение, изменение размера, сворачивание и т. Д., и поддерживают свой z-порядок чуть выше ваших приложений. Я бы не хотел, чтобы эти требования были у моего злейшего врага.

Задумывались ли вы об использовании элемента управления редактора, созданного специально для Delphi (или редактора ActiveX, который вы можете встроить)? Это может быть лучшим подходом.

0
ответ дан 3 December 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: