سؤال

في دلفي لقد استخدمت shellexecute لسنوات لإطلاق (وانتظر اختياريا) التطبيقات الأخرى. الآن على الرغم من أن أحتاج إلى إحدى هذه التطبيقات تظهر في أحد أشكال تطبيق Delphi الخاصة بي. لقد جربت الكود أدناه كاختبار بسيط لفتح المفكرة (الذي يفعل) وعرض النتيجة داخل لوحة 1 على النموذج الخاص بي (الذي لا يفعله). هل يمكن لشخص لطيف أن يضعني على المسار الصحيح؟ شكرا

var
  Rec          : TShellExecuteInfo;
  wnd : HWnd;
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_Show;

  ShellExecuteEx(@Rec);

  wnd := Windows.FindWindow( 'Notepad', nil );
  Windows.SetParent( Wnd, PAnel1.Handle );

end;
هل كانت مفيدة؟

المحلول

يتم حذف كل الأخطاء، ولكن يجب أن تبدأ هذا الأمر:

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 () عائدات.

نصائح أخرى

var
  URL: string;
begin
  URL:= DBMemoURL.Text;
  // ShellExecute(self.WindowHandle,'open', PChar(URL), nil, nil, SW_SHOW); //default browser
     ShellExecute(self.WindowHandle,'open','chrome.exe', PChar(URL), nil, SW_SHOW); 

سيكون ذلك صعبا، إذا كان ذلك ممكنا.

لقد رأيت النهج التي ستعمل على التطبيقات القائمة على النصوص - فهم يقومون بشكل عام بالتقاط الإخراج القياسي للعملية كما يحدث ووضعه في عنصر تحكم نصي.

ولكن ما تتحدث عنه هو تطبيق رسومي متكامل (المفكرة، على الرغم من العمل على النص، وعرض البكسلات، وليس رموز الأحرف).

لذلك، ما لم يكن المفكرة واجهة حيث يمكنك:

  • طلب شخصيات تعسفية في المخزن المؤقت؛ و
  • أرسل كلايتروكس التعسفي إلى البرنامج، أود أن أقول أنك مسطح من الحظ.

بالتأكيد Kludge، ولكن خيار واحد هو مراقبة نوافذ المفكرة بشكل مستمر والتأكد من أنه مضرض دائما على منطقة عميل النماذج الخاصة بك. هذا فظيع جدا لأنك يتعين عليك إيقافها، وتغيير حجمها وتقليلها وما إلى ذلك، و الحفاظ على أمر Z ليكون فقط فوق التطبيقات الخاصة بك. لن أتمنى هذه المتطلبات على أسوأ عدو.

هل فكرت في استخدام عنصر تحكم محرر مصمم خصيصا ل Delphi (أو محرر ActiveX الذي يمكنك تضمينه)؟ قد يكون ذلك نهجا أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top