質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

3653閲覧

外部アプリケーションのスクリーンショット

yuujiMotoki

総合スコア90

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/03/27 21:35

#内容

 別の測定器のデータ抜き出しのために、RPAを作っています。
EXCEL(VBA)をベースに開発していますが、いくつか機能が足りないので、win32のAPIを触っています。

#課題

 現在、直面している課題は、ウィンドウフォームの画面をスクリーンコピーする部分ですが、
ウィンドウにスクロールバーが縦、横に配置されていて、フォーム画面をキャプチャする場合に
エリア全体がデスクトップ画面に無い状態です。
ウィンドウに最大化のメッセージを送っても、画面の矩形寸法が固定されているようで、
それ以上が大きく出来ない状態です。

#質問内容

確認したいことは、下記の2点です。

1)非表示エリアへのアクセス方法
そもそも、グラフィック画面の中に、データは表示されているのであれば、
スクロールバーを触らずに、スクリーンショットに相当する画像データーを
直接引き出したいです。

2)ウィンドウの最大化
フォームのプロパティを触って、最大化する寸法を変更できるのであれば、
スクロールバーが無くなるぐらい状態まで拡大して、それをキャプチャしたいです。

いずれにしろ、上記ができないとなると、

スクロールバーを動かして、キャプチャを繰り返して、
後処理で画像結合などの、面倒な手続きになります。

#補足

いろいろWEBで調査をしているのですが、WINFORMへのアクセスして、
ウィンドウハンドルへのメッセージ送信で最大化は出来ましたが、
フォームに指定された寸法以上にはなりませんでした。

BITBLTで画像転送サイズを指定しても、グラフィック情報からは、
PC画面に出ているものしか得られませんでした
1)については、スクロールしていない箇所は、メモリにも存在しない・・・?
ので、無理のような気がしています。

2)については、サブクラス化という方法で、PROCESSを奪い取り、
WINPROCのメッセージで処理できることを理解しましたが、
やはりプロパティに直接アクセスする方法が分かりません。

https://stackoverflow.com/questions/49913981/win-form-vanishes-on-maximizing

c#

1[DllImport("user32.dll")] 2 static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int 3nHeight, bool bRepaint); 4 private void button1_Click(object sender, System.EventArgs e) 5 { 6 MoveWindow(this.Handle, 0,0, 2000, 2000, true); 7 //Call UpdateBounds in order form to relayout its controls 8 this.UpdateBounds(); 9 } 10 11Don't forget to set form's MaximumSize property to some bigger value

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/03/27 22:34 編集

そのソフトがどのように描画しているのかわかりませんが、スクロールバーの位置に応じて描画している可能性もあります。後で画像結合する方が簡単ではないですか?
dodox86

2020/03/28 01:08

> ウィンドウに最大化のメッセージを送って とありますが、ご提示のMoveWindow()を使ったコードを見ると、これは特に最大化を指定したものではなく、ウィンドウサイズの変更要求です。 最大化を明示的に指定するWindows API(というか、メッセージWM_SYSCOMMAND)がありますが、本当にこのコードを使われていますか?(ただ、その最大化用のメッセージを使っても、そのウィンドウがあえて最大化しないような造りになっている可能性はあります)
hihijiji

2020/03/28 02:37

> スクロールバーを動かして、キャプチャを繰り返して、後処理で画像結合などの、面倒な手続きになります。 此方の方が既存のアプリケーションをハックするより桁違いに簡単です。
guest

回答1

0

自己解決

いろいろ調べたのですが、ウィンドウサイズはFORMオブジェクトの
メモリの中に書かれている内容で、これはプロセスを超えることになり、
別プロセスでは変更できないと書かれていました。

仕方なく、今回は画像を結合することを志向することにします。
(それは、それで大変なのですが)

投稿2020/03/28 08:37

yuujiMotoki

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問