2016-08-23 14 views
1

私のプログラムの形で単語アプリケーションを埋め込みたいと思います。私は次のコードを使用しています:埋め込みワードドキュメント内のタイトルバーは応答しません

procedure TAMainForm.Button1Click(Sender: TObject); 
var 
    WordApp: Variant; 
    WordHandle: THandle; 
    TempTitle: string; 
begin 
    WordApp := CreateOleObject('Word.Application'); 
    TempTitle := 'Temp - ' + IntToStr(Random(1000000)); 
    WordApp.Caption := TempTitle; 
    WordHandle := FindWindow(nil, PChar(TempTitle)); 
    WordApp.Visible := True; 
    Windows.SetParent(WordHandle, Handle); 
    SetWindowPos(WordHandle, 0, Left+20, Top+50, 700, 500, SWP_ASYNCWINDOWPOS); 
end; 

これは私のフォームに大丈夫と言います。ただし、アプリケーションのタイトルバーはすべて黒で、マウスのクリックに反応しません。私のコードで何が間違っていますか?

+1

SetParentを使用している可能性はまったくありません。または実際には他の方法。クロスプロセスの子育ては、他のアプリに強制することはできません。それを放棄し、別のデザインを見つける。 https://blogs.msdn.microsoft.com/oldnewthing/20130412-00/?p=4683 –

+0

Wordは、*エディタ*をCOMオブジェクトとして埋め込むことをサポートしています。 (または、とにかく、それは以前から使用されていました)*アプリケーション全体の埋め込みをサポートしていません。ユーザーがプログラムから離れることなくWord文書を編集できるようにするには、前者を調べます。 –

答えて

2

Windowsのプロセス間の親子関係は、技術的には正当なものですが、管理が非常に難しく、両方のプロセスでこの状況を認識する必要があります。これは彼のブログ記事のRaymond Chenによって詳細に説明されていますIs it legal to have a cross-process parent/child or owner/owned window relationship?このようなクロスプロセスの関係は、あなたが直面している問題の原因である可能性があります。

フォームがWordの上にとどまるようにする場合は、Application.WindowActivateイベントに基づいて回避策を実装することがあります。 Wordのウィンドウがアクティブになるたびに、独自のフォームを上部に表示することができます。 SetWindowPosを使用してください。

関連する問題