Microsoft Access2002・Internet Explorer Ver6を使用しています。VBAを使用しあるサイトにアクセスしPDFファイルをダウンロードしようとしていますが、わからない箇所があります。それは、PDFをDLしようとしてあるボタンをクリックすると、POPUPウインドウが表示され、「開く(O)」「保存(S)」「キャンセル」「詳細情報(M)」のどれかのボタンをクリックしなければなりません。そこで下記質問です。◆まず、このPOPUPウインドウが表示されたどうかのチェックはどのように行えばいいですか?◆また、そのボタンをクリックする方法はありますか?(SENDKEY以外で)以上2点よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/02/13 12:44:16
  • 終了:--

回答(5件)

id:Gyokuran No.1

Gyokuran回答回数662ベストアンサー獲得回数02004/02/13 12:52:05

ポイント10pt

的外れでしたら申し訳ありません。

参考になれば幸いです。

id:topo

ご回答ありがとうございます。

これはフォームの入力のキャンセルの方法なので、ちょっと違う気がします。

まず、ポップアップウインドウが表示されたかどうかをチェックできれば、最悪SENDKEYSでもいけそうな気はするのですが。

まだまだ回答募集します

2004/02/13 13:03:23
id:wm5775 No.2

wm5775回答回数351ベストアンサー獲得回数42004/02/14 01:42:47

ポイント40pt

すみません。ど忘れしましたが、アクティブウィンドウのタイトルを取得するWin32の関数があったと思います。ポップアップウィンドウが出てくるタイミングになったら、ループで上記関数でポーリングし、ポップアップウィンドウを認識したら、SendKeyやSendMessageなどを使ってボタンをクリックするというのはいかがでしょうか?

なぜ、SendKey以外を使いたい事情があるのかはてなからは読み取れませんが、汎用プログラムでなく、画面の条件などが一定のようであれば、マウスカーソルをある座標に移動させてクリックイベントを発行することで、アクティブウィンドウの任意のボタンをクリックすることができると思いますがいかがでしょうか?

id:topo

ご回答ありがとうございます。

質問してから色々調べた所、ポップアップウィンドウでは無く、ダイアログ(?)が表示されているようです。

Win32のAPIでアクティブウィンドウのタイトルを取得しようとしたのですが、うまくいきませんでした。

下記のコードでループさせるとダイアログが表示されると下記のループの中で処理が停止しているようです。

ダイアログのボタンを手動でクリックすると処理が継続します。

Do While Me![IEBrowser].Object.Document.ReadyState <> ”complete”

Debug.Print Me![IEBrowser].Object.Document.ReadyState

DoEvents

Loop

どうやらAPIを利用するのではという所までは予想できるようになったのですが、ダイアログを表示するAPIは見つけたのですが、ダイアログが表示されたかどうかを調べるAPIが必要なようです。

できれば、簡単なコードを利用して方法を教えてくれると助かります。

2004/02/14 10:26:33
id:wm5775 No.3

wm5775回答回数351ベストアンサー獲得回数42004/02/14 13:07:03

ポイント10pt

URLはダミーです。度々の投稿になってしまい申し訳ありません。回答にあったループで停止してしまうということであれば、ポーリングするコードはスレッドにするとうまくいくかもしれません。C++ではスレッドを使用するのは容易ですが、VBではどうでしょうか。VBには疎いので参考にならなかったらすみません。でも、ループが停止するのはアクティプウィンドウをポーリングするコードがメインウィンドウと同一のスレッドにあるためだと思います。

id:topo

ご回答ありがとうございます。

「スレッド」や「ポーリング」の意味が解らないのですが、色々調べてみます。

2004/02/16 14:12:46
id:Nagi No.4

Nagi回答回数12ベストアンサー獲得回数02004/02/15 21:14:20

ポイント10pt

http://homepage1.nifty.com/MADIA/vb/API/EnumWindows.htm

EnumWindows(全てのウインドウを列挙する)

VBAのプログラマじゃないんで、的外れな回答かもしれませんが、Win32 APIの「EnumWindows」を使えば、トップレベルのウインドウを全て取得できます。

この中から、タイトルが「ファイルのダウンロード」となっているウィンドウ(ダイアログ)を探してみてはどうでしょう。

id:topo

ご回答ありがとうございます。

後で、試して見ます。

2004/02/16 14:13:52
id:Nagi No.5

Nagi回答回数12ベストアンサー獲得回数02004/02/16 19:30:30

ポイント50pt

URLはダミーです

以下のコードで、どうでしょう?

1.GetWindowHandleと言う関数で「ファイルをダウンロードしますか」と言うダイアログがあるか調べれます。

2.SendOkと言う関数で、「保存」ボタンをクリックできます。

2はWM_COMMANDを直接送っているので、代りにSendKeysあたりを使った方がいいかもしれません。

Public Declare Function EnumWindows Lib ”user32” (ByVal lpEnumFunc As Long, lPalam As Long) As Long

Public Declare Function GetWindowText Lib ”user32” Alias ”GetWindowTextA” (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Public Declare Function PostMessage Lib ”user32” Alias ”PostMessageA” (ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function SetForegroundWindow Lib ”user32” (ByVal hWnd As Long) As Long

Dim WindowHandle As Long

Sub Button1_OnClick()

’ ウインドウを検索してみる

hWnd = GetWindowHandle()

If hWnd <> 0 Then

’ 見つかったらしい

SendOk (hWnd)

Else

’ 見つからない

MsgBox ”「ファイルをダウンロードしますか」と言うタイトルのウインドウは見つかりません”

End If

End Sub

’ ウインドウの「保存ボタンをクリックする」

Public Function SendOk(ByVal hWnd As Long)

’ ウインドウを最前面に

Ret = SetForegroundWindow(hWnd)

’ 保存ボタンをクリック(WM_COMMANDメッセージを送信)

Ret = PostMessage(hWnd, &H111, &H1144, &H110596)

End Function

’ 「ファイルをダウンロードしますか」と言うタイトルのウインドウを検索

’ 見つかれば0以外を返す

Public Function GetWindowHandle() As Long

’ 0にしておく

WindowHandle = 0

’ ウインドウ検索

Ret = EnumWindows(AddressOf EnumProc, 0)

GetWindowHandle = WindowHandle

End Function

’ コールバック関数

Public Function EnumProc(ByVal hWndX As Long, lParam As Long) As Boolean

Dim Ret As Long

Dim Leng As Long

Dim Name As String

EnumProc = True

’バッファ確保

Name = String(255, Chr(0))

Leng = Len(Name)

’名前を取得する

Ret = GetWindowText(hWndX, Name, Leng)

’名前が”ファイルのダウンロード”

If Ret <> 0 Then

If InStr(Name, ”ファイルのダウンロード”) <> 0 Then

WindowHandle = hWndX

EnumProc = False

End If

End If

End Function

id:topo

ご回答ありがとうございます。

後で試して見ます。

いったんここで終了します。

2004/02/17 12:03:41

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません