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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Web画面の文字をVB6で取得したい
-
Excel 範囲指定スクショについ...
-
配列のペースト出力結果の書式...
-
VBA 別ブックから条件に合うも...
-
エクセルVBAにて =A1=B1とすれ...
-
Excelについて
-
【ExcelVBA】インデックスが有...
-
Excelで画像URLを1つずつセル...
-
Excel VBA 文字列のセルを反映...
-
VBA 指定した回数分、別シート...
-
【VBA】カーソルのある行の1行...
-
ExcelVBAのFindFirstエラ...
-
VBA 入力箇所指定方法
-
VBA 複数の各シートに行を追加...
-
10行目にフィルターを使用して...
-
Excel VBAで値を変えながら、pd...
-
VBA実行後に元のセルに戻りたい
-
エクセルのマクロについて教え...
-
vbaにてseleniumを使用したedge...
-
メールの件名をデコードしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングで火事は起きま...
-
ランキングCGIへのCaptchaの組...
-
Ctrl+Vのキーストロークを合成...
-
excel VBA すごろく
-
CGIゲームの作り方について
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
LCD ディスプレイを Raspberry ...
-
「デバイスは PRN を初期化でき...
-
エクセルVBAでシートモジュール...
-
VBSがコンパイルエラーになりま...
-
VBでグローバル変数を宣言するには
-
Excel VBAで、ユーザーフォーム...
-
VBAで旧字体を異字体に一括で変...
-
ユーザー定義関数に#NAME?が返...
-
VBA This Workbookモジュール...
-
Excel VBA 『Call』で呼び出す...
-
【vba】フォームに書いてあ...
-
Access VBA標準モジュールにつ...
-
モジュールの最大数はいくつな...
おすすめ情報