喫茶XRAYトップページ

[スレッド全体
]

[8171] Re2:互換パックダウンロードのダイアログ操作返信 削除
2014/11/2 (日) 17:58:55 Mr.XRAY
> さて,回避と言ってもいろいろあります.

プログラムのコードで,このダイアログを表示しないようにすることができます.
それには,次のように,DisplayAlerts の値を False にします.

  ExcelObj  := CreateOleObject('Excel.Application');
  ExcelObj.DisplayAlerts := False;

これでダイアログは表示されなくなりますが,
ブックのファイルは読み込まれます.
その結果,読み込まれた内容は下図のように文字化けしていまいます.

このダイアログは,
  ExcelObj.DisplayAlerts := False;
なし(つまり True) にしても,例外ではとらえることができません.



[8172] Re3:互換パックダウンロードのダイアログ操作返信 削除
2014/11/2 (日) 18:18:35 Mr.XRAY
>
>   ExcelObj  := CreateOleObject('Excel.Application');
>   ExcelObj.DisplayAlerts := False;
>
> これでダイアログは表示されなくなりますが,
> ブックのファイルは読み込まれます.


前に書いた
http://mrxray.on.coocan.jp/Delphi/zip/Excel_DialogHook_Test.zip

は,ダイアログを表示しないようにして,
かつ,ブックのファイルを読み込まない方法の 1 つです.

グローバルフックを使用しています.
このグローバルフックは,DLL 内にないと機能しません.
そこで,DLL を作成しています.
コードは以下のサンプルのものを使用しています.

[03_ユーザ定義メッセージ WM_APP を使用する ]
http://mrxray.on.coocan.jp/Delphi/plSamples/280_HookCBTActivate.htm#03

ただし,TListView への表示は必要ないので,そのコードは削除しています.
また,メッセージの値も,自由に変更可能なように,以下のコードで定義しています.

const
  CBT_DLL_MESSAGE = WM_APP+222;


ダイアログは以下のように,検出しています.
エクセルのバージョンや拡張子名は使用していません.

(1) アプリが起動したら,クラス名が #32770 のウィンドウを探す
(2) 見つかったら,タイトル(キャプション) が Microsoft Excel か確認する
(3) そのウィンドウの中にクラス名が Static というウィンドウがあるかを探す
(4) 見つかったら,そのウィンドウのテキストを取得する

そのテキストの中に「互換パック」と「ダウンロード」という文字列が存在したら,
問題のダイアログと決定します.
そのダイアログのウィンドウに文字,N 押下のコードを実行します.
すると,[いいえ] をクリックしたのと同じになります.

このままだと,ブックが読み込まれてしまいます.
そこで,例外処理で捉えます.

というわけです.

自分が未熟だと思ったら,いろいろなことをやってみることです.
≪コンポーネントがいいのか,OCX がいいのか≫
と悩む前に実際にやってみることです.ハイ.


[8173] Re4:互換パックダウンロードのダイアログ操作返信 削除
2014/11/2 (日) 18:44:22 Mr.XRAY
> ≪コンポーネントがいいのか,OCX がいいのか≫

この文章はちょっとへんですけどね (^^;
まっ,深く考えないでくださいませ.
あまり考えると,頭がハゲますから.ハハハッ


[8174] Re4:互換パックダウンロードのダイアログ操作返信 削除
2014/11/2 (日) 18:54:42 Mr.XRAY
> そのテキストの中に「互換パック」と「ダウンロード」という文字列が存在したら,
> 問題のダイアログと決定します.


このテキストの取得ですが,
当サイトのサンプルでは,ほとんど次のコードを使用しています.
これは,主に,ウィンドウのタイトル(キャプション) 文字列の取得としています.

function GetWindowTitleStr(hWindow: HWND): String;
var
  Buffer : array[0..MAX_PATH - 1] of Char;
  Len    : Integer;
begin
  FillChar(Buffer, SizeOf(Buffer), #0);
  Len := GetWindowText(hWindow, Buffer, Length(Buffer));
  if Len > 0 then Result := Buffer else Result := '';
end;

今回の場合は,これでは長い文字列の取得に失敗する可能性があります.
そこで,次のコードを使用しています.
(実際には上のコードでも十分でしたが)

function GetWindowTitleStr(hWindow: HWND): String;
var
  Len    : Integer;
  Buffer : PChar;
begin
  Result := '';
  Len := GetWindowTextLength(hWindow);
  Buffer := StrAlloc(Len + 1);  //SetLength を使用したサンプルもある
  try
    Len := GetWindowText(hWindow, Buffer, StrBufSize(Buffer));
    SetString(Result, Buffer, Len + 1);  //実際には代入互換性がある
  finally
    StrDispose(Buffer);
  end;
end;

こういうことも,実際にやってみると気づくわけです.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82