前提・実現したいこと
お世話になっております。
seleniumを利用して名前を付けて保存ダイアログを出現させ、**FindWindow関数(またはFindWindowEx関数)**を利用してハンドルを取得させ、名前を付けて保存させようとしています。
**SPY++**を利用してハンドル名を取得して保存するデータの名前をつけてOKボタンをクリックし、保存する事はできたのですが、保存先のハンドルの取得と指定がうまくいきません。
試しに実行してもエラーは出ずにその部分に関してはスルーされているように見えます。
ご教授願います。
該当のソースコード
VBA
1Option Explicit 2 3Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 4Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 5Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ 6 ByVal hwndParent As LongPtr, _ 7 ByVal hwndChildAfter As LongPtr, _ 8 ByVal lpClassName As String, _ 9 ByVal lpWindowName As String) As Long 10Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _ 11 ByVal hwnd As Long, _ 12 ByVal wMsg As Long, _ 13 ByVal wParam As Long, _ 14 lParam As Any) As LongPtr 15 16Public Const VK_RETURN As Integer = &HD 17 18Sub test() 19 20 21中略 22 23'名前を付けて保存画面-------------------------- 24 25Dim hwnd As Long 26 ' ウィンドウハンドル取得 27 hwnd = FindWindow("#32770", "名前を付けて保存") ' ウィンドウタイトルで検索する場合 28 29 If hwnd <> 0 Then 30 ' 指定したハンドルのウィンドウを前面に表示 31 SetForegroundWindow hwnd 32 End If 33 34 Driver.Wait (5000) 35 36Dim hInputBox As Long 37Dim hbutton As Long 38 39'アドレスバーを選択する 40'hInputBox = FindWindowEx(hwnd親ハンドル,子のハンドル,ウインドウクラスネーム, "") 41 42hInputBox = FindWindowEx(hwnd, 0, "WorkerW", "") 43hInputBox = FindWindowEx(hInputBox, 0, "ReBarWindow32", "") 44hInputBox = FindWindowEx(hInputBox, 0, "Address Band Root", "") 45hInputBox = FindWindowEx(hInputBox, 0, "msctls_progress32", "") 46hInputBox = FindWindowEx(hInputBox, 0, "Breadcrumb Parent", "") 47hInputBox = FindWindowEx(hInputBox, 0, "ToolbarWindow32", "") 48 49SetForegroundWindow hInputBox 50'アドレスバーに入力場所を入れる 51Call SendMessage(hInputBox, &H6, 1, 0&) 'ToolbarWindow32をアクティブにする 52 53Call SendMessage(hInputBox, &HF5, 0, 0&) 'ボタンをクリックする(アドレス入力可能状態にする) 54 55Call SendMessage(hInputBox, &HC, 0, ByVal "C:\Users\uehara\Desktop") 'アドレス入力 56 57Call SendMessage(hInputBox, &HD, 0, 0&) ' エンターを押す 58 59 60'名前を付けて保存する 61hInputBox = FindWindowEx(hwnd, 0, "DUIViewWndClassName", "") 62hInputBox = FindWindowEx(hInputBox, 0, "DirectUIHWND", "") 63hInputBox = FindWindowEx(hInputBox, 0, "FloatNotifySink", "") 64hInputBox = FindWindowEx(hInputBox, 0, "ComboBox", "") 65hInputBox = FindWindowEx(hInputBox, 0, "Edit", "") 66hbutton = FindWindowEx(hwnd, 0, "Button", "保存(&S)") 67Call SendMessage(hInputBox, &HC, 0, ByVal "テスト") 68Call SendMessage(hbutton, &H6, 1, 0&) 'ボタンをアクティブにする 69Call SendMessage(hbutton, &HF5, 0, 0&) 'ボタンをクリックする 70Driver.Wait (1000) 71End Sub 72
試したこと
該当のハンドルはこちらで間違いないとは思います。
また、アドレス部分のハンドルに対して、SendMessageを利用してクリックをする(その部分を有効かできると考えて)ということも試しましたが、そちらも不発に終わりました。
(2021/10/01更新)
各種ご提案頂いた方法試した結果、ウィンドウハンドル自体は間違っていないようなので、アドレスバーへの指示式(指示方法?)が間違っているように思われます。
利用環境
excel2019 32bit版
変数やDeclare宣言でハンドルはLongPtr型で宣言しなければならないはずです。
ハンドルの実態はポインタですから
32bit版のExcelをご使用であれば結果オーライですが
すみません表記しておけばよかったですね。
利用環境は32ビット版になります。
質問文を編集しておきます。
ご指摘ありがとうございます。
皆様ご回答頂きましてありがとうございました。
h.horikoshi様のご回答でベストアンサーとさせていただきますが、tyamzak_様、takanaweb5様共にお知恵をお貸しいただきまして誠にありがとうございました。
見ていただけているかはわかりませんが、コメントにてお礼申し上げます。
回答4件
あなたの回答
tips
プレビュー