プロが教える店舗&オフィスのセキュリティ対策術

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を指定できないようなので、色々考えた結果、上記のようにするしかないかと考えました。もしもほかによい方法があったら恐れ入りますがご教授いただけると大変ありがたいです。よろしくお願いします。

A 回答 (4件)

sendKeysを使うといいかも

    • good
    • 0
この回答へのお礼

アドバイスいただきありがとうございます。実は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ブロック変数が設定されていません。」と表示されてしまいます。

お礼日時:2005/09/24 12:43

>その後時間が経過した後に本アプリケーションSendKeys利用しようとした場合であっても張り付きません


推測ですが、
SendKeysは、現在アクティブになっているウィンドウ(アプリケーション)にキー入力を送るものなので、タイミングによって自ウィンドウがアクティブになっていないからでじゃないかと思います。
OS起動直後は、特にさまざまな常駐プログラムなどが起動しますから、そのためだと思います。
だから、予防措置としては、SendKeysを実行する前にアクティブになっていることを確かめないといけませんが、プログラムで確かめたところで、他のアプリケーションがすぐさまアクティブになる場合もあるので、そういう切り替わりがないと考えられる状態で実行しないといけないですね。^^;

>オブジェクト変数またはWithブロック変数が設定されていません。
このエラーって時にVBで起こるみたいですね。私的にはプログラムの中で不安定な要素(変数への参照を見失う?)があるような時に起こるというイメージですが、起こる原因というとこれっていうのは難しいですね。
原因となる部分がこのステートメントでない可能性もありますし。
私としては、基本的には、かっちりしたプログラムを作るとかビルドし直すとかそういうことしか思いつきません。

別に質問としてあげるといいかもしれませんね
    • good
    • 0
この回答へのお礼

いろいろとアドバイスしていただきありがとうございます。大変感謝しております。思いあたる部分をひとつずつ調べてみようと思います。

お礼日時:2005/09/26 19:33

>xpにインストールして動かしたところ


XPだからだめだという理由は良く判りません。
基本的には、動くと思われますが、
MEでの開発環境で使っているDLLなどが異なるとかそういうことかもしれません。
XPでの開発環境でビルドしなおしてみたりするとどうでしょうか

>SendKeysで入力することはできますでしょうか。
SendKeys 文字列
なので、そのまま、引数として渡してやればいいと思います。
プラス記号 "+"
カレット "^"
パーセント記号 "%"
ティルダ "~"
などの特殊記号については、{}で囲むというような仕様だったと思いますが、ファイルパスでそうした特殊記号が使われることはほとんどないと思われるので、そのままでいいかと思われます。
(含まれる場合は、置換してやる必要があると思われますが)
    • good
    • 0
この回答へのお礼

色々とありがとうございました。大変感謝しております。おかげさまで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ブロック変数が設定されていません。」等のエラーが発生することもあります。小さくて単純なアプリケーションのはずなのですが、これはリソースの不足か何かが原因でしょうか。

万一何かお気づきの点がございましたら申し訳ございませんがご教授いただければありがたいです。
ありがとうございました。

お礼日時:2005/09/26 02:27

>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で入力することはできますでしょうか。どのように記述すればよいでしょうか。基本的なことかと思われ申し訳ないのですが、教えていただけるとありがたいです。度々申し訳ございませんがよろしくお願いします。

補足日時:2005/09/25 03:44
    • good
    • 0
この回答へのお礼

アドバイスいただきありがとうございます。
DoEvents
Do While WebBrowser1.Busy = True
DoEvents
Loop
WebBrowser1.Visible = True
Do While WebBrowser1.Document.ReadyState<> "complete"
DoEvents
Loop
を追加したら動作するようになったようです。

お礼日時:2005/09/24 22:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!