「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:1
総数:2494
現在:2


Writerのキャプションを取得するには?

ページOpenOffice.org FAQの登録ページ
投稿者まぐねしうむ
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-03-09 15:28:59 (火)
OSXP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

現在MS-OfficeのコードをOpenOffice用に変更しています。
C#で以下のコードにてWordアプリケーションのキャプションを取得し対象アプリケーションの
ウインドウハンドルを取得していました。
(Wordで新規作成のファイルを開いた際にWord上に表示される
 「新規Microsoft Word 文章.doc - Microsoft Word」の文字列)

OpenOfiiceのWriterではWordアプリケーションに相当するオブジェクトはXComponentだと思うのですが
XComponentにはCationはありませんでした。
参考となるHPでも構いませんので、どなたかご存知であれば教えてください。


以下C#のコード

       /// <summary>
       /// Wordを起動後、ハンドルを取得し、ファイルを開く
       /// </summary>
       /// <param name="strFileName">ファイル名</param>
       public override void OpenOffice(string strFileName)
	{
             //Wordアプリ起動
             Word.ApplicationwdApp = new Word.Application()
	      Word.Documents wdDocs = wdApp.Documents;
	     
             //Wordのハンドル取得
             string strCaption = wdApp.Caption;
             wdApp.Caption = "OfficeTest";
             Wind_hwnd = Cls_Win32API.FindWindow("OpusApp", "OfficeTest");
             wdApp.Caption = strCaption;
	}



無題

tani (2010-03-09 17:02:08 (火))

Wordアプリケーションに相当するのは、フレームになるんじゃないかと思います。
http://api.openoffice.org/docs/common/ref/com/sun/star/frame/module-ix.html

Windowのタイトルをどうこうするなら、このあたりです。
http://api.openoffice.org/docs/common/ref/com/sun/star/frame/XTitle.html

Windowハンドラでしたら、この辺です。
http://api.openoffice.org/docs/common/ref/com/sun/star/frame/XFrame.html#getContainerWindow
http://api.openoffice.org/docs/common/ref/com/sun/star/awt/XSystemDependentWindowPeer.html

遅くなりました

まぐねしうむ (2010-03-15 11:22:30 (月))

返信が遅くなりました。
Windowハンドラのをやってみましたが「getContainerWindow」までは行くのですが
そのあとが分かりません。

       public IntPtr GetWindHwnd()
       {
           IntPtr intptrResult = (IntPtr)0;
           XFrame xFramre = _desktop.getCurrentFrame();
           unoidl.com.sun.star.awt.XWindow xWin = xFramre.getContainerWindow();
           //getWindowHandleが存在しない。
           intptrResult=xWin.getWindowHandle();
           return intptrResult;
       }


また、MSDNの様にメソッド等に対応したサンプルコードのHPは
OpenOfficeには無いのでしょうか?

無題

ike@九州 (2010-03-15 12:37:48 (月))

Basic の場合は以下で Ok のようですが、C# は?
http://www.oooforum.org/forum/viewtopic.phtml?t=14908&highlight=getwindowhandle

無題

(2010-03-15 13:53:10 (月))

Basicで当該コードを確認した所、ハンドルの取得が出来ました。
ただ、C#では上にも書いたように「getWindowHandle」メソッドが見つからない為Errになります。
また、.NET Reflectorを使用し、unoidl.com.sun.star.awt内のメソッドを確認してみましたが「getWindowHandle」はありませんでした。
どうやら、.NETではこのメソッドは提供されていないようなのですが、
他にハンドルを取得する方法はないでしょうか?

タイトルの方もやってみましたが・・・

まぐねしうむ (2010-03-15 16:22:44 (月))

unoidl.com.sun.star.frame.XTitle型を返すメソッドが分かりません・・・。

   XTitle xTitle = ???
   string strTitle=xTitle.getTitle();

インターフェースの取得

はにゃ? (2010-03-16 05:57:01 (火))

C# でのインターフェースの取得などは OpenOffice.org SDK の examples/CLI/CSharp 以下に例があります。

アドレスを教えてください。

まぐねしうむ (2010-03-16 09:46:28 (火))

はにゃ? さん
HPのアドレスを教えていただけませんか?
検索してみたのですが、見つけられませんでした。

SDKの公開先

M.Kamataki (2010-03-16 10:25:11 (火))

まぐねしうむさん、HPとはSDKの公開先でしょうか。であれば、以下となります。日本語プロジェクトのダウンロードページ(http://ja.openoffice.org/download/3.2.0/)からたどれます。

http://download.openoffice.org/sdk/

勘違いしていました

(2010-03-16 11:11:41 (火))

MSDNの様なHPで公開されていると思っていました。
そうでは無くてSDKをインストールすると自動的にインストールされるですね
C:\Program Files\OpenOffice.org_3.2_SDK\sdk\examples\CLI\CSharp\
にインストールされていました。

ただ、フォルダ内をxTitleやgetTitleで検索してみましたが
サンプルには含まれていないようです。

C# CLI でのインターフェースクエリ

はにゃ? (2010-03-16 14:37:49 (火))

下記にドキュメントがあります。
http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/ProUNO/CLI/Type_Mappings#XInterface

無題

tani (2010-03-16 15:21:13 (火))

C#では例えばこんなやりかたもあります。
参考までに

using System;
using System.Reflection;

class OpenOffice      // OpenOffice.org application
{
   public static int Main()
   {
       Type t_OOo;
       t_OOo = Type.GetTypeFromProgID("com.sun.star.ServiceManager");
       Object objServiceManager;
       objServiceManager = System.Activator.CreateInstance(t_OOo);

       Object[] args = new Object[1];
       args[0] = "com.sun.star.frame.Desktop";

       Object[] args2 = new Object[4];
       args2[0] = "private:factory/swriter";
       args2[1] = "_blank";
       args2[2] = 0;
       args2[3] = new Object[] { };

       Object[] noargs = new Object[] { };

       Object Stardesktop;
       Object doc;
       Object controller;
       Object frame;
       Object title;
       try
       {

           Stardesktop = objServiceManager.GetType().InvokeMember("createInstance",
                           BindingFlags.InvokeMethod, null,
                           objServiceManager, args);

           doc = Stardesktop.GetType().InvokeMember("loadComponentFromUrl",
                           BindingFlags.InvokeMethod, null,
                           Stardesktop, args2);

           if (doc == null)
           {
               return 1;  // error!!
           }

           controller = doc.GetType().InvokeMember("getCurrentController",
                           BindingFlags.InvokeMethod, null, doc, noargs);
           frame = controller.GetType().InvokeMember("getFrame",
                           BindingFlags.InvokeMethod, null, controller, noargs);
           title = frame.GetType().InvokeMember("getTitle",
                           BindingFlags.InvokeMethod, null, controller, noargs);

           Console.WriteLine(title);
       }
       catch (Exception e)
       {
           Console.WriteLine(e);
           return 1;
       }
       return 0;
   }
}

遅延バインディングでは動きましたが・・・

まぐねしうむ (2010-03-16 17:39:19 (火))

tani さん有難うございます。
提示していただいたコードでは動きました。
ただ、動いたコードを元に事前バインディングに書き換えてみましたが、やはり「getCurrentController」が呼び出せません。
また、同様に「getFrame」も呼び出せませんでした。
なぜでしょう?

               //コンポーネントコンテキストの取得
               XComponentContext componentContext = uno.util.Bootstrap.bootstrap();
               //サービスマネージャの取得
               XMultiServiceFactory multiServiceFactory = (XMultiServiceFactory)componentContext.getServiceManager();
               //コンポーネントローダの取得
               XComponentLoader componentLoader = (XComponentLoader)multiServiceFactory.createInstance("com.sun.star.frame.Desktop");
               if (System.IO.File.Exists(fName))
               //ファイルが存在する場合はそのファイルを開く
               {
                   String sURL = "file:///" + fName;
                   _xCompornet = componentLoader.loadComponentFromURL(sURL, "_blank", 0, new PropertyValue[0]);
               }
               else
               //ファイルが存在しない場合は新規ファイルを開く       
               {
                   _xCompornet = componentLoader.loadComponentFromURL("private:factory/scalc", "_blank", 0, new PropertyValue[0]);
               }
               //getCurrentControllerが無い。
               XController controller = (XController)_xCompornet.GetType().InvokeMember("getCurrentController", BindingFlags.InvokeMethod, null, _xCompornet, noargs);
               XFrame frame = controller.getFrame();
               //XFrame 型にはgetTitleが無い・・・。
               string title = (string)frame.GetType().InvokeMember("getTitle", BindingFlags.InvokeMethod, null, controller, noargs);

バインディングでの例

はにゃ? (2010-03-16 23:11:41 (火))

下記のコードで次のような結果が得られました。

Untitled 1 - OpenOffice.org Calc
uno.Any { Type= System.Int32, Value=2755260}


using System;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.lang;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            unoidl.com.sun.star.uno.XComponentContext xContext;
            xContext = uno.util.Bootstrap.bootstrap();
            XMultiServiceFactory xMsf = (XMultiServiceFactory) xContext.getServiceManager();

            unoidl.com.sun.star.frame.XComponentLoader componentLoader = (unoidl.com.sun.star.frame.XComponentLoader) xMsf.createInstance("com.sun.star.frame.Desktop");
            unoidl.com.sun.star.lang.XComponent doc = componentLoader.loadComponentFromURL(
                "private:factory/scalc", "_blank", 0, new unoidl.com.sun.star.beans.PropertyValue[0]);
            unoidl.com.sun.star.sheet.XSpreadsheetDocument xSpreadsheetDoc = (unoidl.com.sun.star.sheet.XSpreadsheetDocument) doc;
            unoidl.com.sun.star.frame.XModel xModel = (unoidl.com.sun.star.frame.XModel) doc;
            unoidl.com.sun.star.frame.XController xController = xModel.getCurrentController();
            unoidl.com.sun.star.frame.XFrame xFrame = (unoidl.com.sun.star.frame.XFrame) xController.getFrame();
            unoidl.com.sun.star.frame.XTitle xTitle = (unoidl.com.sun.star.frame.XTitle)xFrame;
            String sTitle = xTitle.getTitle();

            System.Console.WriteLine(sTitle);

            unoidl.com.sun.star.awt.XWindow xWindow = (unoidl.com.sun.star.awt.XWindow)xFrame.getContainerWindow();
            unoidl.com.sun.star.awt.XSystemDependentWindowPeer xWindowPeer = (unoidl.com.sun.star.awt.XSystemDependentWindowPeer)xWindow;
            uno.Any handle = xWindowPeer.getWindowHandle(new Byte[0], 1);

            System.Console.WriteLine(handle);
            return;
        }
    }
}

ありがとうございます

(2010-03-17 10:44:34 (水))

はにゃ? さん有難うございます。
動きました!
遅延とちがって事前バインディングだとかなり遠回りになるんですね・・・。
教えていただいたコードを勉強させていただきます!

完了にします

M.Kamataki (2010-03-19 10:14:46 (金))

コメントがありましたので、完了にします。

お名前:
題名: