|
エクセル上で、図面番号を整理しております。
直接パスワード付きの図面(PDFファイル)を開きたいのですが、
うまくいかずに困っています。パスワードはファイルを開くときに必要なものです。
PDFファイルを開くときにパスワードBOXが出ますが、パスワード枠へパスワードを自動で転記し、OKボタンを押す動作が出来ないでしょうか?
動作環境は、
OS:WindowsXp+SP3
エクセル:MicrosoftOffice2007(Excel)
アクロバット:Acrobat7
クラスの取得:spy++(VisualStudio6.0+SP5のVC++付属)
VBAでは、予め、spy++で目的のクラス名を得ていれば立ち上がっているメモ帳へデータを転記することは、可能であることを以下のマクロで確認済です(A1セルをダブルクリックで動作確認済)。
同様にA2セルをダブルクリックするとPDFパスワードに転記するマクロが動くはずなのですが、うまくいきません。アクロバット7のフォーム名はspy++によると、
「#32770(ダイアログ)」と出ますが、なぜか「#32770」としないと戻り値が0で取得できません。また、クラス名で子ウィンドウのハンドルは「Edit」とありますが、戻り値が0で、取得できません。
何か情報をお持ちでしたら、お教え頂けると幸いです。
'事前にメモ帳とパスワード付きのPDFのパスワードを求めるメッセージBOXを
'立ち上げておいて下さい。
'下記マクロをsheet1にコピー&貼付けし、A1、A2セルに適当な文字を入れて
’ダブルクリックするとイベントが発生します。
'------------------------------------------------------------------------
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Const BM_CLICK As Long = &HF5
Private Const WM_ACTIVATE As Long = &H6
Private Const WM_SETTEXT As Long = &HC
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim strWindowClassName As String
Dim lngWindowHandle As Long
Dim strChildWindowClassName As String
Dim lngWindowTextBuffer As String * 255
Dim lngChildWindowHandle As Long
Dim lngResult As Long
Select Case Target.Address
Case "$A$1" 'メモ帳へ転記
' クラス名でウィンドウハンドルを取得
strWindowClassName = "Notepad" '←メモ帳のフォーム名の取得
' メモ帳のウィンドウハンドルを取得
lngWindowHandle = _
FindWindow( _
strWindowClassName, _
vbNullString)
' ウィンドウハンドルを取得できたときは
If lngWindowHandle <> 0 Then
' クラス名で子ウィンドウのハンドルを取得
strChildWindowClassName = "Edit" '←メモ帳の入力枠のクラス名
lngChildWindowHandle = _
FindWindowEx( _
lngWindowHandle, _
0, _
strChildWindowClassName, _
vbNullString)
' 子ウィンドウのハンドルを取得できたときは
If lngChildWindowHandle <> 0 Then
'シートのA1セルの値をメモ帳へ転記
lngWindowTextBuffer = Cells(1, 1)
lngResult = _
SendMessage( _
lngChildWindowHandle, _
WM_SETTEXT, _
0, _
ByVal lngWindowTextBuffer)
End If
End If
Case "$A$2" 'PDFのパスワード枠へ転記
' クラス名でウィンドウハンドルを取得
strWindowClassName = "#32770" '←アクロバット7のフォーム名の取得
' メモ帳のウィンドウハンドルを取得
lngWindowHandle = _
FindWindow( _
strWindowClassName, _
vbNullString)
' ウィンドウハンドルを取得できたときは
If lngWindowHandle <> 0 Then
' クラス名で子ウィンドウのハンドルを取得
strChildWindowClassName = "Edit" '←PDFのパスワード枠のクラス名
lngChildWindowHandle = _
FindWindowEx( _
lngWindowHandle, _
0, _
strChildWindowClassName, _
vbNullString)
' 子ウィンドウのハンドルを取得できたときは
If lngChildWindowHandle <> 0 Then
'シートのA2セルの値をPDFのパスワード枠へ転記
lngWindowTextBuffer = Cells(2, 1)
lngResult = _
SendMessage( _
lngChildWindowHandle, _
WM_SETTEXT, _
0, _
ByVal lngWindowTextBuffer)
End If
End If
End Select
End Sub
|
|