none
仮想デスクトップにおける画面コピーについて RRS feed

  • 質問

  • 以下のようなスクリプトを使い、Windows10で画面キャプチャ(起動中のIEの領域のみにフォーカス)を行っています。

    $PWD = (split-Path $script:myInvocation.MyCommand.path -parent)
    $internetExploler = New-Object -ComObject InternetExplorer.Application
    $internetExploler.Visible = $true  
    
    function snapShot($fileName)
    {
       $activeWindow = new-object -com WScript.Shell
       $activeWindow.AppActivate("Explorer")
       Add-Type -AssemblyName system.windows.forms 
       $hardCopy = new-object Drawing.Bitmap($internetExploler.width,$internetExploler.height)
       $bitmap = [drawing.graphics]::FromImage($hardCopy)
       $bitmap.CopyFromScreen($internetExploler.Left, $internetExploler.top, 0,0,$hardCopy.size)
       $hardCopy.save("${PWD}\${fileName}","png")
    }
    
    snapShot "screenShot01.png"

    これまでは、これで問題なかったのですが、Windows10の仮想デスクトップ機能を使い、第一画面と第二画面を切り替えて使うことになりました。

    第二画面にIEを置き、上記のスクリプトを走らせて目的を達成したいのですが、問題なのは、実行の瞬間まで、カレントのデスクトップは第二画面でなくてはいけないようなのです。

    たとえばsleepコマンドなどで5分後に画面キャプチャをするように仕込んで実行し、その後第一画面で別の作業を行っている場合でも、第二画面のIEの領域をキャプチャしたい場合、どのようにすれば良いでしょうか。

    PowerShellのバージョンは5.1です

    • 編集済み Fuzitaman 2017年3月29日 3:26 PSのバージョン追加
    2017年3月29日 0:42

回答

  • すみません。検証が行えていないのですが、PrintWindow APIを使うと画面に表示されていないウィンドウのキャプチャーが行えるようです。下記のようなプログラムでキャプチャをとることはできますでしょうか?

    Add-Type -TypeDefinition @"
    using System;
    using System.Runtime.InteropServices;
    
    public static class Win32Api
    {
      [DllImport("User32.dll")]
      public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
    }
    "@
    
    $PWD = (split-Path $script:myInvocation.MyCommand.path -parent)
    $internetExploler = New-Object -ComObject InternetExplorer.Application
    $internetExploler.Visible = $true  
    
    function snapShot($fileName)
    {
       $activeWindow = new-object -com WScript.Shell
       $activeWindow.AppActivate("Explorer")
       Add-Type -AssemblyName system.windows.forms 
       $hardCopy = new-object Drawing.Bitmap($internetExploler.width,$internetExploler.height)
       $bitmap = [drawing.graphics]::FromImage($hardCopy)
       $dc = $bitmap.GetHdc();
       [Win32Api]::PrintWindow($internetExploler.hWnd, $dc, 0);
       $bitmap.ReleaseHdc($dc);
       $hardCopy.save("${PWD}\${fileName}","png")
    }
    
    snapShot "screenShot01.png"
    • 編集済み kenjinoteMVP 2017年3月29日 2:58 ReleaseHdcが抜けていました
    • 回答としてマーク Fuzitaman 2017年3月29日 3:24
    2017年3月29日 1:57

すべての返信

  • すみません。検証が行えていないのですが、PrintWindow APIを使うと画面に表示されていないウィンドウのキャプチャーが行えるようです。下記のようなプログラムでキャプチャをとることはできますでしょうか?

    Add-Type -TypeDefinition @"
    using System;
    using System.Runtime.InteropServices;
    
    public static class Win32Api
    {
      [DllImport("User32.dll")]
      public static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);
    }
    "@
    
    $PWD = (split-Path $script:myInvocation.MyCommand.path -parent)
    $internetExploler = New-Object -ComObject InternetExplorer.Application
    $internetExploler.Visible = $true  
    
    function snapShot($fileName)
    {
       $activeWindow = new-object -com WScript.Shell
       $activeWindow.AppActivate("Explorer")
       Add-Type -AssemblyName system.windows.forms 
       $hardCopy = new-object Drawing.Bitmap($internetExploler.width,$internetExploler.height)
       $bitmap = [drawing.graphics]::FromImage($hardCopy)
       $dc = $bitmap.GetHdc();
       [Win32Api]::PrintWindow($internetExploler.hWnd, $dc, 0);
       $bitmap.ReleaseHdc($dc);
       $hardCopy.save("${PWD}\${fileName}","png")
    }
    
    snapShot "screenShot01.png"
    • 編集済み kenjinoteMVP 2017年3月29日 2:58 ReleaseHdcが抜けていました
    • 回答としてマーク Fuzitaman 2017年3月29日 3:24
    2017年3月29日 1:57
  • Windows10でうまくいきました、ありがとうございました!

    2017年3月29日 3:27