|
出来るのだ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 |