
Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付けたいと考えています。
いろいろ調べた結果、大体以下のように記述すればよいのではないかとおもったのですが記述に間違いがあるようです。(form上のText1内に張り付けることができません。)恐れ入りますが、何卒ご教授いただきたくお願いいたします。
Option Explicit
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2
Private Const VK_CONTROL = &H11
Private Sub Command1_Click()
Call keybd_event(VK_CONTROL, 0, 0, 0)
Call keybd_event(Asc("V"), 0, 0, 0)
Call keybd_event(Asc("V"), 0, KEYEVENTF_KEYUP, 0)
Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0)
End Sub
ちなみに使用目的につきましては、form1上のWebBrowser1に開いた入力フォームの<input type="file" >に(JavaScriptでフォーカスを移したうえで)ファイルのパスを貼り付けることです。
<input type="file" >はvalueを指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
sendKeysを使うといいかも
アドバイスいただきありがとうございます。実はsendKeysとはどういったものかも知らなかったような状態でしたので、その後、sendKeysでWebBrowser内の送信フォームに書き込む方法についていろいろ調べました。その結果、だいたい以下のようになるのではないかと思って試したのですが
Me.Enabled = True
KeyPreview = True
WebBrowser1.Document.myFORM.uploadfile.focus
SendKeys "abcd", True
Me.Enabled = False
(送信formのnameは「myFORM」、fileのnameは「uploadfile」)
実行すると「オブジェクトはこのプロパティまたはメソッドをサポートしていません」と表示されてしまいます。
デバッグすると、「WebBrowser1.Document.myFORM.uploadfile.focus」の行が黄色く表示されます。
その後送信フォームを確認すると、「abcd」と入力されているので、もう一歩だと思うのですが、どこが間違っているかご教授いただけると大変ありがたく存じます。ちなみに遅れましたがvb6.0です。よろしくお願いいたします。
ちなみに以下のようなものも試してみたのですが
Me.Enabled = True
KeyPreview = True
WebBrowser1.Document.All("uploadfile").focus
SendKeys "abcd", True
Me.Enabled = False
実行すると「オブジェクト変数またはWithブロック変数が設定されていません。」と表示されてしまいます。
No.4
- 回答日時:
>その後時間が経過した後に本アプリケーションSendKeys利用しようとした場合であっても張り付きません
推測ですが、
SendKeysは、現在アクティブになっているウィンドウ(アプリケーション)にキー入力を送るものなので、タイミングによって自ウィンドウがアクティブになっていないからでじゃないかと思います。
OS起動直後は、特にさまざまな常駐プログラムなどが起動しますから、そのためだと思います。
だから、予防措置としては、SendKeysを実行する前にアクティブになっていることを確かめないといけませんが、プログラムで確かめたところで、他のアプリケーションがすぐさまアクティブになる場合もあるので、そういう切り替わりがないと考えられる状態で実行しないといけないですね。^^;
>オブジェクト変数またはWithブロック変数が設定されていません。
このエラーって時にVBで起こるみたいですね。私的にはプログラムの中で不安定な要素(変数への参照を見失う?)があるような時に起こるというイメージですが、起こる原因というとこれっていうのは難しいですね。
原因となる部分がこのステートメントでない可能性もありますし。
私としては、基本的には、かっちりしたプログラムを作るとかビルドし直すとかそういうことしか思いつきません。
別に質問としてあげるといいかもしれませんね
No.3
- 回答日時:
>xpにインストールして動かしたところ
XPだからだめだという理由は良く判りません。
基本的には、動くと思われますが、
MEでの開発環境で使っているDLLなどが異なるとかそういうことかもしれません。
XPでの開発環境でビルドしなおしてみたりするとどうでしょうか
>SendKeysで入力することはできますでしょうか。
SendKeys 文字列
なので、そのまま、引数として渡してやればいいと思います。
プラス記号 "+"
カレット "^"
パーセント記号 "%"
ティルダ "~"
などの特殊記号については、{}で囲むというような仕様だったと思いますが、ファイルパスでそうした特殊記号が使われることはほとんどないと思われるので、そのままでいいかと思われます。
(含まれる場合は、置換してやる必要があると思われますが)
色々とありがとうございました。大変感謝しております。おかげさまでXPでもなんとか動くようになりました。
DoEvents
Do While WebBrowser1.Busy = True
DoEvents
Loop
WebBrowser1.Visible = True
Do While WebBrowser1.Document.ReadyState<> "complete"
DoEvents
Loop
のかわりにtimerを利用して、もしもうまくいかない場合エラー処理に任せることにより、無理やりではありますが一応動作するようになりました。
ちなみに上記のソースを実行後は、SendKeysを2回実行すると張り付くようでしたがどうしてでしょう。
またたとえばOS起動直後に本アプリケーションがformを開いた場合、その後時間が経過した後に本アプリケーションSendKeys利用しようとした場合であっても張り付きません。OS起動後しばらくは操作できないようにすることで対応しましたが、どうしてでしょう。
また、まれにですが、
WebBrowser1.Document.myFORM.uploadfile.focus
のところでエラー処理に飛ばずに「オブジェクト変数またはWithブロック変数が設定されていません。」等のエラーが発生することもあります。小さくて単純なアプリケーションのはずなのですが、これはリソースの不足か何かが原因でしょうか。
万一何かお気づきの点がございましたら申し訳ございませんがご教授いただければありがたいです。
ありがとうございました。
No.2
- 回答日時:
>WebBrowser1.Document.myFORM.uploadfile.focus」の行が黄色く表示されます。
実際に同じものを作って試してみたわけではないのですが、
こういうエラーを起こす原因で良くあるのは、
HTMLのレンダラーが完全に終わってない状態でその内容にアクセスしようとすることです。
HTMLの読み込みが完了した後(onloadイベントが起こった後)でなければ、フォームにアクセスしてはいけません。
まだ、存在しないフォームにアクセスしようとするのでエラーになります。
具体的には
Document.readyState が "complete"になるまで待たないといけません。
すでにそういう処置をされていて、勘違いコメントだったらすみません。
この回答への補足
度々申し訳ありません。
WebBrowser1.Document.myFORM.uploadfile.focus
SendKeys "^v"
MeのVB上では動くのですが、xpにインストールして動かしたところ、myFORMのuploadfileにフォーカスは移るのですが、張り付きません。心当たりの点がございましたら恐れ入りますがアドバイスいただけないでしょうか。よろしくお願いします。
ちなみに、クリップボードから貼り付けるのではなく、(テキストボックスText1や変数a)に入っているApp.Path & "\" & "test.gif"といったパスをSendKeysで入力することはできますでしょうか。どのように記述すればよいでしょうか。基本的なことかと思われ申し訳ないのですが、教えていただけるとありがたいです。度々申し訳ございませんがよろしくお願いします。
アドバイスいただきありがとうございます。
DoEvents
Do While WebBrowser1.Busy = True
DoEvents
Loop
WebBrowser1.Visible = True
Do While WebBrowser1.Document.ReadyState<> "complete"
DoEvents
Loop
を追加したら動作するようになったようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Excel(エクセル) 【VBA】 Alt+PrintScreenにてアクティブウィンドウのスクショを貼付する方法 4 2022/12/08 20:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】並び替えの範囲が、...
-
VBA ユーザーフォーム ボタンク...
-
2つのマクロでチェックボックス...
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
[VB.net] ボタン(Flat)のEnable...
-
VBAでCOPYを繰り返すと、処理が...
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
Vba 型が一致しません(エラー1...
-
【ExcelVBA】値を変更しながら...
-
Excelのマクロについて教えてく...
-
【ExcelVBA】5万行以上のデー...
-
VBAでセルの書式を変えずに文字...
-
Excel VBA 選択範囲の罫線色の...
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
エクセルの改行について
-
エクセルのVBAコードと数式につ...
-
ExcelのVBAコードについて教え...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ctrl+Vのキーストロークを合成...
-
Windows98seでBorlandC++5.51を
-
メールフォームCGI作成費用
-
excel VBA すごろく
-
プログラミングで火事は起きま...
-
VBAでWebクエリにて情報を自動...
-
Ruby defにするとエンコードが...
-
携帯から書き込める日記を作り...
-
例外処理のフローチャートの記...
-
「デバイスは PRN を初期化でき...
-
VBAで別モジュールへの変数の受...
-
ユーザー定義関数に#NAME?が返...
-
エクセルVBAでシートモジュール...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
Excel VBA 定義されたプロージ...
-
VBでグローバル変数を宣言するには
-
vba userFormのSubを標準モジュ...
-
VBSがコンパイルエラーになりま...
-
モジュールの最大数はいくつな...
おすすめ情報