Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付ける方法

このQ&Aのポイント
  • Ctrl+Vのキーストロークを合成して、クリップボードの内容を貼り付けたいと考えています。
  • 記述に間違いがあるようですが、form上のText1内に張り付けることができません。
  • 使用目的は、form1上のWebBrowser1に開いた入力フォームの<input type="file">にファイルのパスを貼り付けることです。
回答を見る
  • ベストアンサー

Ctrl+Vのキーストロークを合成したいのですが

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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

sendKeysを使うといいかも

oomiyaji
質問者

お礼

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

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>その後時間が経過した後に本アプリケーションSendKeys利用しようとした場合であっても張り付きません 推測ですが、 SendKeysは、現在アクティブになっているウィンドウ(アプリケーション)にキー入力を送るものなので、タイミングによって自ウィンドウがアクティブになっていないからでじゃないかと思います。 OS起動直後は、特にさまざまな常駐プログラムなどが起動しますから、そのためだと思います。 だから、予防措置としては、SendKeysを実行する前にアクティブになっていることを確かめないといけませんが、プログラムで確かめたところで、他のアプリケーションがすぐさまアクティブになる場合もあるので、そういう切り替わりがないと考えられる状態で実行しないといけないですね。^^; >オブジェクト変数またはWithブロック変数が設定されていません。 このエラーって時にVBで起こるみたいですね。私的にはプログラムの中で不安定な要素(変数への参照を見失う?)があるような時に起こるというイメージですが、起こる原因というとこれっていうのは難しいですね。 原因となる部分がこのステートメントでない可能性もありますし。 私としては、基本的には、かっちりしたプログラムを作るとかビルドし直すとかそういうことしか思いつきません。 別に質問としてあげるといいかもしれませんね

oomiyaji
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>xpにインストールして動かしたところ XPだからだめだという理由は良く判りません。 基本的には、動くと思われますが、 MEでの開発環境で使っているDLLなどが異なるとかそういうことかもしれません。 XPでの開発環境でビルドしなおしてみたりするとどうでしょうか >SendKeysで入力することはできますでしょうか。 SendKeys 文字列 なので、そのまま、引数として渡してやればいいと思います。 プラス記号 "+" カレット "^" パーセント記号 "%" ティルダ "~" などの特殊記号については、{}で囲むというような仕様だったと思いますが、ファイルパスでそうした特殊記号が使われることはほとんどないと思われるので、そのままでいいかと思われます。 (含まれる場合は、置換してやる必要があると思われますが)

oomiyaji
質問者

お礼

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

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>WebBrowser1.Document.myFORM.uploadfile.focus」の行が黄色く表示されます。 実際に同じものを作って試してみたわけではないのですが、 こういうエラーを起こす原因で良くあるのは、 HTMLのレンダラーが完全に終わってない状態でその内容にアクセスしようとすることです。 HTMLの読み込みが完了した後(onloadイベントが起こった後)でなければ、フォームにアクセスしてはいけません。 まだ、存在しないフォームにアクセスしようとするのでエラーになります。 具体的には Document.readyState が "complete"になるまで待たないといけません。 すでにそういう処置をされていて、勘違いコメントだったらすみません。

oomiyaji
質問者

お礼

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

oomiyaji
質問者

補足

度々申し訳ありません。 WebBrowser1.Document.myFORM.uploadfile.focus SendKeys "^v" MeのVB上では動くのですが、xpにインストールして動かしたところ、myFORMのuploadfileにフォーカスは移るのですが、張り付きません。心当たりの点がございましたら恐れ入りますがアドバイスいただけないでしょうか。よろしくお願いします。 ちなみに、クリップボードから貼り付けるのではなく、(テキストボックスText1や変数a)に入っているApp.Path & "\" & "test.gif"といったパスをSendKeysで入力することはできますでしょうか。どのように記述すればよいでしょうか。基本的なことかと思われ申し訳ないのですが、教えていただけるとありがたいです。度々申し訳ございませんがよろしくお願いします。

関連するQ&A

  • Windows7-VB6でのアクティブウィンドウキャプチャ

    Windows7-VB6でのアクティブウィンドウキャプチャ お世話になります。 Private Declare Sub keybd_event Lib "User32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const VK_LMENU = &HA4 Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private Const KEYEVENTF_KEYUP = &H2 Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click() Command1.SetFocus DoEvents Load form2 Clipboard.Clear keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY, 0 keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0 DoEvents keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 keybd_event VK_LMENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0 ※form2.picPrint.Picture = Clipboard.GetData() 上記コードはWinXPであれば問題なく動作するのですが Win7ではform2のピクチャボックスにイメージが貼り付けられません ※行にブレイクを入れて、一旦プログラムを停止し再開するとOKで その他にもALTキーの送信をしないでprtscrのみでも動作可能です。 win7-vb6でアクティブウィンドウのキャプチャを クリップボードを使用し、フォームのピクチャボックスに貼り付けることは 可能でしょうか

  • 画面ハードコピーのプログラム

     お世話になります。  株チャートの動きを確認する為、ボタンをクリックすると、モニタに映ってるモノ全体が、瞬時に、BMPで保存されるというプログラムを作ってます。 キーボードの PrtScSysRq を押して、エクセルなどに貼付け保存という手作業をエクセルではなく BMP に置き換えて保存という事です。  過去の類似質問を見てみますと、「ピクチャーボックスの画像を保存」はありましたが、「モニタの画像」は見当たらず、グーグルなどで検索して、ムリヤリ作ってみました。下記参照。  しかし、実際動かしてみると、「名前がついて保存されてるが何も映っていない」「瞬時ではなく、30秒~2分くらい前の画像が保存される」という不具合になってます。    この場合の正しいプログラムを教えて欲しいです。  御教授御願いします。 form1 に .Command1 .Picture1 を貼り付けます。 Private Type tagKEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As Long bytUnusedPadding(7) As Byte End Type Private Type tagINPUT type As Long ki As tagKEYBDINPUT End Type Private Const INPUT_KEYBOARD = 1 Private Const VK_LMENU = &HA4& Private Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As tagINPUT, ByVal cbSize As Long) As Long Private Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Const VK_SNAPSHOT = &H2C Private Const KEYEVENTF_KEYUP = &H2 Private Const KEYEVENTF_EXTENDEDKEY = &H1 Private IYI As String, G_CC As Integer Private Sub Command1_Click() G_CC = G_CC + 1 Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0) Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) Picture1.Picture = Clipboard.GetData IYI = "C:\test\" & G_CC & "_SAMP.BMP" Call SavePicture(Picture1.Image, IYI) Clipboard.Clear End Sub Private Sub Form_Load() With Me .ScaleMode = vbPixels With .Picture1 .Appearance = 0 .AutoRedraw = True .AutoSize = True .BorderStyle = 0 .Visible = False End With End With G_CC = 0 End Sub

  • NumLockの制御について

    VB5.0(SP3)で次のプログラムを作成しました。 キーボードからNumLockキーを押して状態をOFFにすると、プログラム側(タイマー関数内)でその状態をチェックし、状態をONに戻します。 しかし、次の動作をした時に問題が発生しました。 但し、この問題は、OSがWindowsNT4.0(SP6)の端末で発生するのですが、Windows2000/XP では発生しませんでした。 起動したフォーム画面にフォーカスがある間は問題ないのですが、フォーカスを外した状態でNumLockキーを押して状態をOFFにすると、ON/OFFが繰り返されてしまいます。 この時に、マウスをフォーム画面の上に持ってくるとその繰返し処理が止まります。 もちろん再度 NumLockキーを押しても止まります。 OSの問題なのでしょうか?それともプログラムが悪いのでしょうか? 下記にそのプログラムを表記します。 <プログラム> フォーム(Form1)にタイマー(Timer1)を貼りつけただけです。 (Module1.bas) Option Explicit Public Const VK_NUMLOCK = &H90 Public Const KEYEVENTF_KEYUP = &H2 Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Declare Sub keybd_event Lib "user32.dll" (ByVal bVk As Byte, _                        ByVal bScan As Byte, _                        ByVal dwFlags As Long, _                        ByVal dwExtraInfo As Long) (Form1.frm) Option Explicit Private Sub Form_Load()   Timer1.Interval = 100 End Sub Private Sub Timer1_Timer()   On Error Resume Next   If GetKeyState(VK_NUMLOCK) = 0 Then     keybd_event VK_NUMLOCK, 0, 0, 0     keybd_event VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0   End If End Sub

  • VB6でWindows2003 Serveの画面ハードコピーを取るには

    VB6で画面のハードコピーを取るのに下記のような関数を作成して動作させています。 今回、windows 2003 Serverで初めて使用したのですが、エラーが出力されます。 Public Sub xxxxxx()  Dim OsVer As Single  Clipboard.Clear  OsVer = CreateObject("SysInfo.SYSINFO").OSVersion   If OsVer < 5 Then  '画面全体のスナップショットを取得する(Win98SE/Win95)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) Else    '画面全体のスナップショットを取得する(WinXP)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0)    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)  End If End Sub エラーの内容は ErrNO=429 ActiveX コンポーネントはオブジェクトを作成できません。 と言うエラーなのですが、2003 serverではkeybd_eventの使い方がXp等と違うのでしょうか? 何処が悪いのかおわかりの方ご教示頂けないでしょうか? 宜しくお願いいたします。

  • 外部アプリ(コマンドプロンプト)の制御

    こんにちは。プログラミング初心者で申し訳ないのですが、調べてみてもどうしても分からない問題があり、ご質問させて頂きました。お手数をおかけしますがご回答頂ければ幸いです。 windowsアプリケーションにて外部のアプリを呼び出し、それを操作しようとした時に、私のような素人が思いつく方法としては、keybd_eventAPIなどでキーを送る、とかWM_LBUTTONDOWNなどのウィンドウメッセージを送る、くらいしか思いつかないのですが、それ以外に外部操作の方法はあるのでしょうか? 例えば、今私が作ろうとしているのは独自アプリよりコマンドプロンプトを呼び出し、事前に指定したいくつかのコマンドを実行する、といったものなのですが、CreateProcessにて起動し、コマンドプロンプトのハンドルを得たところまでは良かったのですが、そのハンドルを利用してどのようにコマンドを送れば良いのかがどうしても分かりませんでした。 「cd ../」というコマンドを送りたい場合、 Keybd_event(Byte('c'),0,0,0); Keybd_event(Byte('c'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('d'),0,0,0); Keybd_event(Byte('d'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte(' '),0,0,0); Keybd_event(Byte(' '),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('.'),0,0,0); Keybd_event(Byte('.'),0,KEYEVENTF_KEYUP,0); Keybd_event(Byte('/'),0,0,0); Keybd_event(Byte('/'),0,KEYEVENTF_KEYUP,0); のようなやり方しか思いつかないのですが、他に良い方法はございませんでしょうか? 宜しければご指導して頂けますよう宜しくお願い致します。

  • buttonを使用したtextboxへの入力について

    こんにちは、初めて投稿させていただきます。 現在VB2005を勉強しています。 ボタンを押すとtextboxに文字が入力されるというものを作成しているのですがひらがなを漢字に変換した際、次の文字を打とうとすると2文字目を入力した際に変換した文字が消えてしまいます。 このような具合です。 「きょうは」と打ち、変換して「今日は」にした後「はれ」と打とうとすると「れ」を入力した際に「今日は」が消えて「はれ」だけになってしまいます。 何処がいけないのかまったくわからない状況で困っています。 ボタンの設定は下記のようにkeybd_eventでそれぞれ行っています。 Private Sub ExButton1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExButton1.Click TextBox4.Focus() 'Aを押す TextBox4.Text = "" TextBox4.Focus() Call keybd_event(VK_A, 0, 0, 0) Call keybd_event(VK_A, 0, KEYEVENTF_KEYUP, 0) End Sub

  • VB6で他のアプリへ左右のCTRLキーを送る方法

    先に「Excel VBA で CTRLキーを送る方法」と題して質問したものです。 VB6でSendInputを使うアドバイスを頂きCTRLを送ることが出来たので解決したと思っていましたが、左右のキーの判断が出来ていないようです。 下記のコードを実行形式にしてたとき、引数の如何にかかわらず、受け取る側(YourAppli.ws)では右のCTRLを受け取った動作をします。左のCTRL(Zキーに近い方)を受け取った動作をしてくれません。 アプリケーションに左右のCTRLを認識させる方法をご教示お願いします。 コードの作成は http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendinput/​を参考に致しました。 Option Explicit Private Type KEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As Long no_use1 As Long no_use2 As Long End Type Private Type INPUT_TYPE dwType As Long xi As KEYBDINPUT End Type '仮想キーコード Private Const KEYEVENTF_KEYUP = &H2 'キーアップ Private Const KEYEVENTF_EXTENDEDKEY = &H1 'スキャンコードは拡張コード Private Const INPUT_KEYBOARD = 1 '入力タイプ:キーボード Private Const VK_CTRL = &H11 'Contorol Private Const VK_LCONTROL = &HA2 'Left_Contorol Private Const VK_RCONTROL = &HA3 'Right_Contorol Private Const VK_RETURN = &HD 'Right_Contorol Private Const KEY_DOWN = 0 'キー押し下げ Private Const KEY_UP = 1 'キーアップ '仮想キーコード・ASCII値・スキャンコード間でコードを変換する Private Declare Function MapVirtualKey Lib "user32" _ Alias "MapVirtualKeyA" (ByVal wCode As Long, _ ByVal wMapType As Long) As Long 'キーストローク、マウスの動作、ボタンのクリックをシミュレートする Private Declare Function SendInput Lib "user32.dll" _ (ByVal nInputs As Long, pInputs As INPUT_TYPE, _ ByVal cbsize As Long) As Long ' 指定時間Wait(ミリ秒) Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub Main() Const AppID = "YourAppli.ws" Dim i As Integer AppActivate AppID Select Case Command Case "L", "l" Send_LCtrl Case "R", "r" Send_RCtrl Case "" Send_Ctrl Case Else MsgBox ("Error") End Select Sleep 50 End Sub Private Sub Send_LCtrl() Call KeyEvent(VK_LCONTROL, KEY_DOWN) Call KeyEvent(VK_LCONTROL, KEY_UP) End Sub Private Sub Send_RCtrl() Call KeyEvent(VK_RCONTROL, KEY_DOWN) Call KeyEvent(VK_RCONTROL, KEY_UP) End Sub Private Sub Send_Ctrl() Call KeyEvent(VK_CTRL, KEY_DOWN) Call KeyEvent(VK_CTRL, KEY_UP) End Sub Sub KeyEvent(VkKey As Integer, UpDown As Integer) ' VkKey:仮想キーコード ' UpDown:動作(KEY_DOWN/KEY_UP) ' Dim inputevents As INPUT_TYPE With inputevents .dwType = INPUT_KEYBOARD With .xi .wVk = VkKey '操作キーコード .wScan = MapVirtualKey(VkKey, 0) 'スキャンコード If UpDown = KEY_DOWN Then 'キーDown .dwFlags = KEYEVENTF_EXTENDEDKEY Or 0 Else 'キーUP .dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP End If .time = 0 .dwExtraInfo = 0 End With End With Call SendInput(1, inputevents, Len(inputevents)) End Sub

  • C/C++でIEの選択範囲を取得する方法

    C/C++で、IE上で範囲選択している場合に、別のアプリケーションからその選択範囲を取得する方法をおしえてください。 今は、IEにCTRL+Cを送って、クリップボード経由で取得する方法を検討しています。 以下のようなコードで、範囲選択をしているウィンドウのタイトルは取れているのですが、クリップボードへのコピーができていません、ハンドルが違うような気がするのですが... どうすればよろしいのでしょうか?? char buf[1000]; HWND hWndFore; /* フォアグラウンドウィンドウの取得 */ hWndFore = GetForegroundWindow(); /* ウィンドウタイトルの表示 */ GetWindowText(hWndFore, buf, 1000); //MessageBox(NULL, buf, "DoGetForegroundWindow", MB_OK); keybd_event(VK_CONTROL, 0, 0, 0); keybd_event('C', 0, 0, 0); keybd_event('C', 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); よろしくお願いいたします。

  • 'Alt+z'キーを押しながらマウスのドラッグを制御する方法

    お世話になっております。 VBで'Alt+z'キーを押しながらマウスのドラッグを制御するのがうまくいかなくて困っています。 実行すると実際には各ボタンは押されているようなのですが、手動でやるような動作をしないのです。 どこか、問題個所はありますでしょうか?ご教授お願い致します。 Private Const VK_Z = 90 'Zキー Private Const MOUSE_MOVED = &H1 Private Const MOUSEEVENTF_LEFTUP = &H4 '左ボタンUP Private Const MOUSEEVENTF_LEFTDOWN = &H2 Call keybd_event(&H12, 0, 0, 0)'Altキー押下 Call keybd_event(VK_Z, 0, 0, 0)'Zキー押下 Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) 'マウス左ボタン Call mouse_event(MOUSE_MOVED, ax, ay, 0, 0) 'ボタンを押したまま移動 Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) 'ボタンを解除

  • クリップボードにアクティブウィンドウが貼り付けられません。

    Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Sub Command1_Click() Clipboard.Clear Form2.Picture1.AutoRedraw = True Form1.SetFocus keybd_event vbKeySnapshot, 0, 0, 0 Do While Clipboard.GetFormat(vbCFBitmap) = False DoEvents Loop Form2.Picture1.Picture = Clipboard.GetData() End Sub keybd_eventを使って、こんな感じでForm2のピクチャーにForm1を貼付けしたいのですが、画面全体がコピーされてしまいます。 アクティブウィンドウのみコピーするにはどうしたら良いですか?