Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2009年06月11日] [更新 2013年11月20日] ワード操作フォームEx
   
ワード操作フォームEx   参考コード類
ワードの文書のハンドル値
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Word 2010







ワードの文書のハンドル値を取得


例えば以下のコードで取得できます.
ワード操作フォームEx では,フォームのキャプションに,拡張子を除いた文書名を表示しています.このテストでは,ワード自身で文書を開いた時と同じ文書名を取得して表示してみました.


図1
実行例
図2
docx 形式の文書の場合
  • [互換モード] の文字がない

リスト1
ワードの文書のハンドル値を取得
implementation

{$R *.dfm}

var
  WordDocHandle : HWND;

//=============================================================================
//  フォームを表示する時の処理
//=============================================================================
procedure TplWordFormEx2.FormShow(Sender: TObject);
begin
  //表示する文書の指定
  wdfFileFullPath := 'テスト文書.doc';

  //元のOnShowを実行
  inherited;
end;

//=============================================================================
//  フォームを閉じる時の処理
//=============================================================================
procedure TplWordFormEx2.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  //保存したことにしてしまう
  if wdfFileOpened then wdfWordDoc.Saved := True;

  //元の処理を実行
  inherited;
end;

//-----------------------------------------------------------------------------
//  EnumChildWindows関数のコールバック関数
//
//  文書のハンドルの取得
//  確認のために,取得した内容をMemo1に表示している
//  Word2007以上では拡張子がdocの場合,[互換モード]の字が入る
//-----------------------------------------------------------------------------
function EnumWindowProc(AWnd: hWnd; lPalam: LPARAM): Boolean;Stdcall;
var
  TheText : Array[0..MAX_PATH-1] of char;
  DocName : String;
  TextStr : String;
begin
  Result := True;

  DocName := String(lPalam);

  if (GetWindowText(AWnd, TheText, MAX_PATH) <> 0) then begin
    if IsWindowVisible(AWnd) then begin
      TextStr := TheText;
      plWordFormEx2.Memo1.Lines.Add(TextStr);

      if (Pos(DocName,TextStr) > 0) and (Pos('Microsoft', TextStr) = 0) then begin
        Result        := False;
        WordDocHandle := AWnd;
        exit;
      end;
    end;
  end;
end;

//=============================================================================
//  表示中のワードの文書ハンドルをEnumChildWindowsのコールバック関数で取得
//  ワードはPanelLeft(TPanel)をParentとして表示している
//  そこでその子ウィンドウを検索
//=============================================================================
procedure TplWordFormEx2.Button1Click(Sender: TObject);
var
  ADocName : String;
begin
  Memo1.Lines.Clear;
  if wdfWordApp.Documents.Count > 0 then begin
    ADocName := wdfWordDoc.Name;

    EnumChildWindows(PanelLeft.Handle, @EnumWindowProc, LPARAM(PChar(ADocName)));
    if WordDocHandle <> 0 then begin
      MessageBox(Handle, PChar(IntToStr(WordDocHandle)), '情報', MB_ICONINFORMATION);
    end;
  end;
end;

//=============================================================================
//  表示中のワードのハンドル
//=============================================================================
procedure TplWordFormEx2.Button2Click(Sender: TObject);
begin
  MessageBox(Handle, PChar(IntToStr(wdfWordHandle)), '情報', MB_ICONINFORMATION);
end;