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

このQ&Aのポイント
  • keybd_eventを使用してアクティブウィンドウのみをクリップボードにコピーする方法を調べています。
  • Form2のピクチャーにForm1を貼り付けたいが、画面全体がコピーされてしまうため、アクティブウィンドウのみをコピーする方法を知りたい。
  • 質問者はkeybd_eventを使ってForm2のピクチャーにForm1を貼り付けたいが、画面全体がコピーされてしまうため、アクティブウィンドウのみをコピーする方法を知りたいとしています。
回答を見る
  • ベストアンサー

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

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を貼付けしたいのですが、画面全体がコピーされてしまいます。 アクティブウィンドウのみコピーするにはどうしたら良いですか?

  • 9766
  • お礼率52% (601/1143)

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

過去ログにあります

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=185224
9766
質問者

お礼

どうやらWIN/NTではわたしのプログラムではダメみたいです。 教えて頂いた方法で解決できました。 どうもありがとうございました。

関連する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

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

  • VBAでのカーソル移動とマウスクリック

    業務上の単純作業の自動化のため、VBAから他のアプリケーションを操作することが目的です。 以前、ブラウザ上での作業の時に使用した、下記2つのAPIでは今回はマウスカーソルが指定した座標に動いてくれません、、、 Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) この2つのAPI以外で、カーソル移動とマウスクリックを実現する方法は何かありますでしょうか? 色々な方法を教えていただけるとVBAの勉強にもなり幸いです。 ' // 標準モジュール Option Explicit Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Type POINTAPI     x As Long     y As Long End Type Private Sub クリックテスト() Call SetCursorPos(216, 421) Sleep 400 Call mouse_event(&H2, 0, 0, 0, 0) Call mouse_event(&H4, 0, 0, 0, 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

  • クリップボードの中身を判別

    PHPなどは理解しておりますが、VBに関してはまったく素人で何もわからないものです。 今回、クリップボードの中身を常に監視して、ある文字列が含まれていたらそのまま、それ以外の文字列の場合は空にするアプリが必要になりました。 そこでネットでいろいろ探して次のように作りました。 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'クリップボードの文字列データを取得する Dim ClipBoardValue As IDataObject Dim ClipBoardString As String Dim okng As Boolean Do 'クリップボードのデータを取得() ClipBoardValue = Clipboard.GetDataObject ClipBoardString = ClipBoardValue.GetData(DataFormats.Text).ToString okng = ClipBoardString.Contains("反応あり") If (okng) Then 'クリップボードに文字列をコピーする Clipboard.SetDataObject("反応あり") Else Clipboard.SetDataObject("") End If Loop End Sub End Class 一つのフォームにボタンを一つ設置し、起動したら監視開始、ボタンをクリックしたら終了という形にしています。 動作させると、以下の問題があります。 ・どんな文字をコピーしてもすぐ空になってしまう ・フォームが表示されない ・起動時にクリップボードの中身が空だとエラーが表示される (オブジェクトのインスタンスにはnewを使用しろとかなんとか。。。) 正しい動作をするコードを教えていただけないでしょうか。 よろしくお願い致します。

  • マウスイベントが動かない

    エクセルシートのダブルクリック イベントで  Call マウス左クリック  とします。 ret = SetCursorPos(929, 12) カーソル移動と SendKeys " 12345" は動くのですが mouse_event 2, 0, 0, 0, 0 '左ダウン mouse_event 4, 0, 0, 0, 0 '左アップ この二つが 動いてくれません。 遅延させるタイマー入れたり、するのですが同じです。 MODULE の中に入れたり、シートの中に入れても 同じです。 どこが、問題なのでしょうか よろしくどうぞ Sub タイミング() stime = gettickcount Do While gettickcount - stime < 1000 DoEvents Loop Sub マウス左クリック() ret = SetCursorPos(929, 12) mouse_event 2, 0, 0, 0, 0 '左ダウン mouse_event 4, 0, 0, 0, 0 '左アップ ret = SetCursorPos(309, 282) SendKeys " 12345" ret = SetCursorPos(309, 320) SendKeys " 12345" SendKeys " {ENTER}" SendKeys " %(RY)", True Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Public Type POINTAPI X As Long Y As Long End Type  ’位置取得 '------------------------------------------------------------------ Private Declare Sub mouse_event Lib "user32" _ (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As _ Long, ByValcButtons As Long, ByVal dwExtraInfo As Long) Public Declare Function SetCursorPos Lib "user32" _ (ByVal X As Long, ByVal Y As Long) As Long

  • Excel2003VBAでクリップボードにあるビットマップの操作について

    Excel2003VBAにおいてクリップボードにあるビットマップの画像の任意の1pxの色を、 ペイントのスポイトツールのように取得するマクロを作成したいのですが GetPixelという関数で画像の任意1pxの色を取得できる所までは調べられたのですが、 それをクリップボードの画像で使用することができませんでした。 以下は、GetPixel関数を試してみた時のソースになります。 '------------------------------------------------------------------ Option Explicit Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub ピクセル色獲得() Dim hwnd As Long Dim hdc As Long hwnd = GetDesktopWindow() hdc = GetWindowDC(hwnd) Debug.Print Hex(GetPixel(hdc, 100, 200)) End Sub '------------------------------------------------------------------ 上記ソースで任意1pxの色を取得できたため クリップボードの画像の色を取得するマクロを下記のように作成しました。 '--------------------------------------------------------------- Option Explicit Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub クリップボードピクセル色獲得() Dim CB As Variant Dim i As Long CB = Application.ClipboardFormats Debug.Print Hex(GetPixel(CB, 100, 200)) End Sub '--------------------------------------------------------------- 型が一致しません と言われ動きません。 以上です、よろしくお願いいたします。

  • コマンドボタンにEXEファイルのアイコンを表示

    コマンドボタンにEXEファイルのアイコンの表示に ついてWebで色々と調べてやってみたのですが、 どうも上手くいきません・・・。(^^; 下記の条件・コードでやってみました。 原因等わかる方いましたら、どうか宜しくお願いします。 ---環境--- OS:Windows2000 Pro VB:VB6 Pro SP6 ---ソースコード(標準モジュール)--- Public Declare Function DrawIconEx Lib "USER32" (ByVal hDC&, ByVal xLeft&, _ ByVal yTop&, ByVal hIcon&, ByVal cxWidth&, ByVal cyWidth&, ByVal istepIfAniCur&, _ ByVal hbrFlickerFreeDraw&, ByVal diFlags&) As Long Public Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" _ (ByVal lpszFile As String, ByVal nIconIndex As Long, phiconLarge As Long, _ phiconSmall As Long, ByVal nIcons As Long) As Long Public Const DI_NORMAL = &H3 ---ソースコード(フォームモジュール)--- Private Sub Command1_Click() Dim Ret As Long Dim nFile As String Dim L As Long Dim S As Long nFile = "C:\Windows\calc.exe" Ret = ExtractIconEx(nFile, 0, L, S, 1) DrawIconEx Form1.Picture1.hDC, 0, 0, L, 0, 0, vbNull, 0, DI_NORMAL Set Form1.Command1.Picture = Form1.Picture1.Image End Sub

  • Excel VBA によるマウス操作

    こんばんは。 まず以下のコードをご覧ください。 Public Declare Sub mouse_event Lib "user32.dll" _ (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _ ByVal dwData As Long, ByVal dwExtraInfo As Long) Public Const MOUSEEVENTF_ABSOLUTE = &H8000& Public Const MOUSEEVENTF_MOVE = &H1 Public Const MOUSEEVENTF_LEFTDOWN = &H2 Public Const MOUSEEVENTF_LEFTUP = &H4 Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 Public Const MOUSEEVENTF_MIDDLEUP = &H40 Public Const MOUSEEVENTF_RIGHTUP = &H10 Public Const MOUSEEVENTF_RIGHTDOWN = &H8 Sub test() Call mouse_event(MOUSEEVENTF_ABSOLUTE, 10, 65500, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) End Sub ExcelでSub test()を実行し、マウスで画面の左下の「スタート」を左クリックしたのと同じ結果が出ればいいのですが、うまくいきません。 フォームボタンで実行したらしばらくポインターが点滅していました。 クリックはされているようですが、移動ができてないようです。 このAPI関数というものが、このカテゴリーでよいのかも分からない私ですが、どうかご回答よろしくお願いします。