自分の画面よりも大きい Web サイト全体のスクリーン ショットを一度に撮りたいです。Robot クラスを使用して可視領域のスクリーンショットを撮る方法を知っています。私が考えたこれを行う1つの方法は次のとおりです。
- ブラウザを起動し、目的の Web サイトに移動します
- プログラムを開始
- プログラムは可視領域のスクリーンショットを撮ります
- プログラムは下にスクロールしてページの後半を表示し、スクリーンショットを撮ります
- 両方のスクリーンショットが結合されます
これはやや不器用な解決策であり、現時点では (Web ブラウザーのウィンドウをスクロールするために) それが可能かどうかさえわかりません。だから私はより良い解決策のヒントを探しています。
編集 1: これは、元の投稿で思い描いていたものです。フローは(プロトタイプ)です:
- ブラウザーを開き、モニター 1 で目的の Web サイトに移動します。
- モニター 2 で、プログラムを実行します (私の場合はネット Bean から)
- プログラムは最初のスクリーンショットをキャプチャしますが、Robot.mouseScroll が呼び出された場合、スクロールするのは Web ブラウザではなく NetBeans ウィンドウです。
- ブラウザー画面をスクロールするには、マウスのモニター 1 を動かし、クリックしてフォーカスを取得し、スクロールしてから、別のスクリーンショットを撮ります。これで、ステッチできる 2 つの png 画像ができました。
問題は、技術的にはこれを行うことはできますが、プログラムを介してマウスを動かしているため、コンピューターで同時に他のことを行うことができないことです。目標は、Excel で作業しながら、プログラムでスクリーンショットを取得し、同時に画像を分析する (情報をステッチして抽出する) ことです。現在の設定では、それは不可能です。
さらに、Java ではこれがまったくできないように見え始めています。興味深いことに、JavaScript でできる可能性があり、Win Api を使用した C++ でできるようです。これは残念です。何か考えはありますか?
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
int width;
int height;
try{
// Get screen devices.
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gdevices = ge.getScreenDevices();
// Find out widht and height of each, print line.
for (int i = 0; i < gdevices.length; i++){
System.out.println("Device " + i);
System.out.println("Width:" + gdevices[i].getDisplayMode().getWidth());
System.out.println("Height:" + gdevices[i].getDisplayMode().getHeight());
}
// Get width and height again for later. Don't worry about this now.
width = gdevices[1].getDisplayMode().getWidth();
height = gdevices[1].getDisplayMode().getHeight();
// Initiate robot.
Robot robot = new Robot(gdevices[1]);
// Size of printscreen area. Temporary. Will be entire screen later.
Rectangle captureSize = new Rectangle(0,0,500,500);
// Take screenshot on gdevice[1]
BufferedImage bufferedImage = robot.createScreenCapture(captureSize);
File outputfile = new File("My Screenshot" + 1 + ".png");
boolean write = ImageIO.write(bufferedImage, "png",outputfile);
// Preparing to take another screenshot after.
/* Need to move mouse to monitor where screenshot is taken. Mouse
* is currently at a monitor that displays NetBeans, which is where
* I'm running this from, for now.
*/
robot.mouseMove(200,200);
/* Need to activate window by gaining focus, don't how to do with robot
* do with mouse instead.
*/
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
/* After the first screen shot, scroll screen that's now
* active (focused?)
*/
robot.mouseWheel(3);
// Take second screenshot.
robot.delay(1000);
bufferedImage = robot.createScreenCapture(captureSize);
outputfile = new File("My Screenshot" + 2 + ".png");
//write into second half
write = ImageIO.write(bufferedImage, "png",outputfile);
}
catch (AWTException e){
System.err.println("Somethingfishy is going on ...");
}
}
}
編集 2: 新しいアプローチ OK、これをよく考えてみてください。たとえ、移動の代わりに alt+tab を使用するなど、フォーカスを見つけたとしても、Excel で同時に作業する必要があるため、役に立ちません。「仮想モニター」のアイデアに関する別の質問を開始します。お二方、アイデア提供ありがとうございました。