出来るのだASP Q&A掲示板(過去LOG)  訪問数 52046 昨日 889 今日 776
    【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。
Topに戻る 掲示板に戻る 検索 削除 管理者

ACROBAT READER の終了方法(ハンドル)?   北岳さん [2001/12/13 19:11:51] [1259]
  Re:ACROBAT READER の終了方法(ハンドル)?   Tomitomiさん [2001/12/13 20:36:02] [1260]
  ACROBAT READER のOCX?   Tomitomiさん [2001/12/14 11:04:22] [1261]
    Re:ACROBAT READER のOCX?   北岳さん [2001/12/14 12:14:35] [1262]
  アドビ一族の陰謀   北岳さん [2001/12/14 13:52:38] [1263]

[1259] ACROBAT READER の終了方法(ハンドル)?
投稿者:北岳さん 2001/12/13 19:11:51
当方現在、ASPもブラウザも無関係の、スタンドアロン環境で(今のところ)、
WINDOWS2000pro+VB5+AcrobatReader5 を使っています。
VB5のshell関数でAcroRd32.exeを起動させて、指定したpdfファイル(**)を開き、
pdf内の(一見画像の)テキスト文字列を、全頁まとめてtxtファイルに一括コピー・ペーストしようとしています。
 
AcrobatReaderのメソッドが全然判らないので、VBのsendkeys関数で操作しています。
で、pdfファイル中身の文字列をコピーし、txtファイルにペーストする所まではできました。
 
最後に、「pdfファイルを開いたままのAcrobatReaderを閉じたい」のですが、
ハンドル名が違うらしくて、(自分の手で閉じない限り)どうにも閉じません。(★の部分)
ハンドル名がお分かりの方、教えて頂けないでしょうか。
 
=============================================================
■標準モジュール
 
Declare Function FindWindow _
Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
'---------------------
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Long) As Long
 
=============================================================
■form1モジュール
 
Option Explicit
Dim path1 As String, path2 As String, adobe As String, buf As String
Dim flag As Integer
Dim lpClassName As String, lpCaption As String
Dim Handle1 As Long, Handle2 As Long
 
'-------------------------------------
Private Sub Form_Load()
Form1.Timer1.Interval = 5000 'ms
End Sub
 
'-------------------------------------
Private Sub Command1_Click()
'** pdf内のテキスト書込用ファイルを用意
Open "c:\documents and settings\administrator\デスクトップ\1.txt" For Output As #1
'** Acrobat5からpdfファイルを開く
path1 = "c:\documents and settings\administrator\デスクトップ\"
path2 = "info77.pdf" '(**)pdfファイル名を指定
adobe = "c:\Program Files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe"
buf = adobe & " " & path1 & path2
Shell buf, vbNormalFocus
'** pdf全頁のテキスト文字列を一度に選択しコピー
10 SendKeys "%E"
SendKeys "S"
SendKeys "%E"
SendKeys "C"
'** 取り込みに時間がかかる場合を想定、5秒待つ。
flag = 0
20: DoEvents
If flag = 1 Then
'** クリップボードの中身をテキストファイルに書く
Print #1, Clipboard.GetText
Else
GoTo 20
End If
Close
Call AcroQuit '■
MsgBox ("終了")
End
End Sub
 
'-------------------------------------
Sub Timer1_Timer()
flag = 1
End Sub
 
'-------------------------------------
Sub AcroQuit()
'** Readerの終了 '■
'lpCaption = "AVPageView"
lpClassName = "AVL_AVView" ★
lpCaption = "Acrobat Reader" ★
'lpClassName = "Afx:400000:8:10011:0"
'* ウインドウのハンドル取得
Handle1 = FindWindow(lpClassName$, lpCaption$)
'* 閉じる
Handle2 = SendMessage(Handle1, &H112, &HF060&, 0&)
End Sub
 
=============================================================
参考にしたのは、
甲:[VB] システム メニューを持つアプリケーションをクローズする方法
http://www.microsoft.com/japan/support/kb/articles/J044/1/40.asp
乙:[VB] ウィンドウのクラス名や属性を取得する方法
http://www.microsoft.com/japan/support/kb/articles/J046/4/37.asp
です。
 
Acrobat Readerのクラス名などは、乙を使ってタイトルバー位置で調べると
Window.Handle:&H100008E
Window Text:Acrobat Reader - [info77.pdf]
Window Class Name: Afx:400000:8:10011:0:4020239
Window Style: &H14CF8000
などとなりますが、Class Nameの後の方の数字が毎回変わってしまうため、どう書けば・・・

[1260] Re:ACROBAT READER の終了方法(ハンドル)?
投稿者:Tomitomiさん 2001/12/13 20:36:02
こんばんわ、Tomitomiです。

僕も試してみましたが、閉じませんねぇ。
暫定として、sendkeys関数で、ファイル+閉じる を実行してみては?

また明日でも調べてみます。

[1261] ACROBAT READER のOCX?
投稿者:Tomitomiさん 2001/12/14 11:04:22
こんにちは、Tomitomiです。

今日、AcrobatReaderのAPI関連ないかなぁ。と調べていたら、

C:\Program Files\Adobe\Acrobat 5.0\Reader\ActiveX\pdf.ocx

に、AcrobatReaderのOCXがありました。
試してみたところ、プロパティのSRCにPDFファイルまでのパスを入れるだけで、
VBのフォームのOCXにPDFが表示されます。
これは使えるのでは?

[1262] Re:ACROBAT READER のOCX?
投稿者:北岳さん 2001/12/14 12:14:35
tomitomiさん、ありがとうございます。
 
>暫定として、sendkeys関数で、ファイル+閉じる を実行してみては? 
 
とりあえず、これは成功しました。
タイマーも標準モジュールもなくして、下のフォーム単独で動きました。
 
=====================================
Private Sub Command1_Click()
Open "c:\documents and settings\administrator\デスクトップ\1.txt" For Output As #1
path1 = "c:\documents and settings\administrator\デスクトップ\"
path2 = "info77.pdf" 'pdfファイル名
fyl = path1 & path2
adobe = "c:\Program Files\Adobe\Acrobat 5.0\Reader\AcroRd32.exe"
buf = adobe & " " & fyl
'---
ret = Shell(buf, vbNormalFocus)
SendKeys "%E", True '編集
SendKeys "S", True 'すべてを選択
SendKeys "%E", True '編集
SendKeys "C", True 'コピー
DoEvents
Print #1, Clipboard.GetText 'ファイル#1にペースト
'AppActivate ret 'readerにフォーカス
SendKeys "%F", True 'ファイル
SendKeys "X", True '終了
MsgBox ("終了")
End
End Sub
=====================================
 
タイマー使用時、フォーカスがAcrobat Reader(pdf)からVBに移ってしまい、SendKeys "X~"(改行チルダ付き)とやったら、VBのコード中に文字Xが書きこまれました。
ProgIDの文字列を選んでCreateObjectしてからSetFocusしようにも、エラーばかり。
で、結局タイマーもやめました。
---
(最初の意図)
自宅機(Win98)の、Acrobat Reader 4では、1頁開いて「編集-すべてを選択」すると、その頁しか選択できません。
50ページもある特許明細書を相手にするので、頁めくり機能コミで、自動化しようと考えました。
ところがReader 5では「編集-すべてを選択」すると、全頁を一気に選択できることが判りましたので、自動化する意味も薄れました。
自宅機のReaderのバージョンを上げるほうが早そうです。(98にver5が入るかは現在不明ですが。)
というオチが付きましたが、メソド不明のOLEをVBで扱う練習問題としては最適そうなので、続けています。
---
(OLEコンテナコントロール)
>AcrobatReaderのOCXがありました。
>試してみたところ、プロパティのSRCにPDFファイルまでのパスを入れるだけで、
>VBのフォームのOCXにPDFが表示されます。
>これは使えるのでは?
 
フォームに挿入してしまえばフォーカスが移る心配もなさそうな気もしますが、メソドは一切不明のままなので、どこまで制御できるのかな?と思いますが・・・まあ、やってみれば判りますね。
---
(ハンドル名)
これを間違いなく取れれば、外部からのアプリ終了が自在になるのに・・・
Try & Error でClass Nameを色々入れてみるしか手はないんでしょうね。
Create Objectの方も試行法。なんか、不満。(といっても、高価な本を買う気はしませんが。)

[1263] アドビ一族の陰謀
投稿者:北岳さん 2001/12/14 13:52:38
>Acrobat Readerのクラス名などは、乙を使ってタイトルバー位置で調べると
>(略)
>などとなりますが、Class Nameの後の方の数字が毎回変わってしまうため、どう書けば・・・
 
待てよ、Class Nameが毎回変わるとは、異常ですね。
ひょっとしたら、乱数を宛てがっているのでは?
「普通の」アプリ、例えばEXCELではどうでしょうか。
 
==========標準モジュール===============
(前掲に同じ)
 
==========form1(Command1とtimer1のみ配置)===============
Option Explicit
Dim path1 As String, path2 As String, xls As String
Dim buf As String, flag As Integer, ret
Dim lpClassName As String, lpCaption As String
Dim Handle1 As Long

'-------------------------------------
Private Sub Command1_Click()
Timer1.Interval = 5000
path1 = "c:\docume~1\administrator\デスクトップ\"
path2 = "test.xls"
xls = "d:\msoffice\office\excel.exe"
buf = xls & " " & path1 & path2
ret = Shell(buf, vbNormalFocus)
lpClassName = "XLMAIN" '「乙」で調査
lpCaption = "Microsoft Excel"
flag = 0
Do Until flag = 1
DoEvents
Loop
Handle1 = FindWindow(lpClassName$, lpCaption$)
buf = SendMessage(Handle1, &H112, &HF060&, 0&)
MsgBox ("終了")
End
End Sub
 
'-------------------------------------
Sub timer1_timer()
flag = 1
End Sub

=============================================
 
VBのshell関数でEXCELのxlsファイルが開き、WindowsのAPIで無事閉じました。
 
ということは、Acrobat Readerではハンドル名の取得はできない仕掛けになっている?
Adobe社は、無料のソフトには大した機能は持たせたがらない?
どうも、最初からできないことに取り組んでいたような気がしてきました。



TreeBBS For ASP V.0.1.3
Program By YasNet