Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for multiple displays #9

Open
n2naokun opened this issue Mar 18, 2024 · 11 comments
Open

Support for multiple displays #9

n2naokun opened this issue Mar 18, 2024 · 11 comments

Comments

@n2naokun
Copy link

English (Translation)
Due to the space around my PC, I have arranged the displays as shown in the image below,
When using this software to read the screen, the second and third displays do not go dark and the starting position for reading cannot be specified on the second and third displays.
It is possible to start on the No. 1 display and extend the range to the No. 2 and No. 3 displays.
In this case, the range frame is not displayed.
Is it possible to support such an irregular arrangement?
image

Translated with www.DeepL.com/Translator (free version)

Japanese (Original)
PC周辺のスペースの関係上下記の画像のようにディスプレイを配置しているのですが、
本ソフトウェアで画面読み取りをする際に2,3番のディスプレイが暗転せず2,3番ディスプレイ上で読み取り開始位置を指定できません。
1番ディスプレイ上から開始して2,3番ディスプレイへ範囲を広げることはできます。
※その際範囲枠は表示されません。
この様な変則的な配置に対応させることはできますでしょうか。
image

@bigbamboo-jp
Copy link
Owner

(To all viewers) The content below will be written in Japanese, so please translate it if necessary.

バグ報告ありがとうございます。画像付きの分かりやすい解説、助かります。
このソフトは基本的に1つのディスプレイ内の範囲のみをキャプチャするように設計してあるので、「1番ディスプレイ上から開始して2,3番ディスプレイへ範囲を広げることはできます。」の部分が非常に謎です。
実際に検証してみたいところなのですが、自分自身1つしかモニターを持っていないので再現のしようがありません。
確かなことがあるとすれば、1番・2番・3番モニターを入れ替えても、恐らく同じような挙動を示すであろうということぐらいでしょうか。
原因がはっきりすれば今後のリリースにおいて追加の設定項目を付けたりしようとは思いますが、とりあえず現状のところは「Win+Shift+S」でSnipping Toolを使ってクリップボード上に画像を載せた後(最新のSnipping Toolでは自動でコピーしてくれます)、「Win+Shift+D(このソフトの設定で変更可能)」でOCR処理をさせるようにしてください、としか回答することができません。
ちょうどマイナーアップデート(1.3.6.0)のリリース時期なので出来れば解決策を盛り込みたかったのですが、現状お力になることができません。。。
このソフトの利用をお試し頂き、心から感謝します。

(私は日本人なので、以降の返信などは日本語で結構です。)

@n2naokun
Copy link
Author

Windowsはメインディスプレイの左上を0,0として扱ってそれより左側と上側をマイナス座標で扱っているようです。

Shoot.xaml.csのコードを見た感じですと、このアプリの場合ドラッグ開始位置と終了位置を取得し
private void CaptureScreen内で左上の座標とそこからのサイズを取得しCopyFromScreenを使用して
デスクトップ画像の切り抜きを取得しているのでメインディスプレイから開始して他のディスプレイに
跨った場合でも正しく画像の取得ができているのだと思います。

画面キャプチャの実装的には複数のディスプレイがあっても動作する実装になっていますが、
メインディスプレイ上に表示されている開始位置が暗転範囲内でのみ指定できる実装のため
今のような動作になっていると思います。

なので、全てのスクリーンを取得して一番左端と上端、右端と下端の座標を指定して全体に表示させてやれば
指定自体は画面全体で指定できそうです。

Functions.cs内のDetectScreenshotTextにある
// 切り取るスクリーンショットを準備する(切り取り方式の場合)
の辺りも変更しないとプライマリスクリーンの画像が引き延ばされた状態で表示されてしまうようですが。

ここまでは分かりましたけど
// 切り取るスクリーンショットを準備する(切り取り方式の場合)
の部分の修正はいい方法を思いつきませんでした。

@bigbamboo-jp
Copy link
Owner

返信ありがとうございます。
実のところ、Shoot.xaml.csはファイルの中のコメントにもあるように

https://astel-labs.net/blog/diary/2012/07/21-1.html

のページにあるastel-labs.netさんのコードを大きくベースにして作っていたりするので、デスクトップの画面をキャプチャする仕組みについてはそこまで理解できていなかったりします。。。
自分は1つの画面でしかWindowsを使ったことがないので分からないのですが、Snipping Toolも呼び出された際に全ての画面が暗転するのでしょうか?なんとなく現在カーソルがあるディスプレイ内でのみキャプチャをしようとする仕様だと思いますが、実際のところどうなのかなとは思います(一応Snipping Toolに仕様を合わせたいとは思っているので、そこ結構大事です)。

ちなみにご提案頂いた通り、一番左端と一番上端からキャプチャしようとした場合でも、ご提示頂いた画像でいうところの3番ディスプレイではなく、1番ディスプレイからの開始となってしまうので(プライマリースクリーンの左端上端が座標で言う0,0に設定されるであろうため)、n2naokunさんが目指される挙動にはならないのではないかと思います。

本当申し訳ないのですが、自分のデスクには1台のモニターしかないので、実際にサンプルコードを書いてみることもできません。。。
なので具体的なプロトタイプの実装などがあれば、シングルモニター環境で問題が起きないことの確認だけして実装しようと思いますが、それ無しではこれ以上進めることができません。

お力になることができず、すいません。

@n2naokun
Copy link
Author

WindowsのSnipping Toolは全てのディスプレイに跨ってキャプチャすることができますね。

実装については色々試してみます。

@n2naokun
Copy link
Author

一応私の環境では動いたコードをプルリクエストしています。

@bigbamboo-jp
Copy link
Owner

bigbamboo-jp commented Mar 21, 2024

プルリクエスト頂いたコードをビルドしてテストしてみましたが、確かにSnipping Toolみたいに全ての画面で一斉に画面が暗転して、キャプチャできるようになっていました。
プロトタイプ実装のご提供、心から感謝します。
しかしながら、シングルディスプレイ時・マルチディスプレイ時に関わらず処理開始時に画面の一番下と一番右の部分が消えてしまう問題があるため、このままではマージできません。
※ただし、画面撮影の方式(ライブ撮影方式)によってはこの問題は回避できているかもしれません(ざっと見た感じでは発生していないようですが、偶然そう見えているだけのような感じでもあります)。
ペイントで作ったので見にくくて恐縮ですが、参考イラストを添付しますので、今一度コードの検証をお願い致します。

help_image_1

@n2naokun
Copy link
Author

うちの環境だとどちらの撮影方式でも表示されないエリアは無いんですよね……
OSのバージョンの違いでしょうか?
うちはWindows 10を使用しているので、Windows 11だと取得値が変わるのかもしれません。

あと、うちの環境ではエラーでブレイクポイントが動作してくれないので詳しい調査ができません。

@bigbamboo-jp
Copy link
Owner

bigbamboo-jp commented Mar 21, 2024

一応、こちらではWin10とWin11両方で試しているのですが、プルリクエスト頂いたコードだと、どうしても左上にキュッと寄る感じになってしまいます。

自分の環境ではどのPCも〈拡大縮小とレイアウト〉の設定項目から150%だったり200%だったりに設定しているので、もしかしたらそれが関係している可能性があるのかなぁとは考えています(実際に150%程度の拡大率で利用している人は普通に居ると思うので、特殊すぎる環境でもないのではないかと考えています)。

とにかくコードの一部に修正をしないと現行のバージョンから挙動が変わってしまうので、修正案が出てくるまではプルリクエストの承認は厳しいかと思います。

何卒よろしくお願いします。

@n2naokun
Copy link
Author

わかりました。
色々試してこちらで再現が取れて修正できましたらまたプルリクエストを送らせていただきます。

@ioritree
Copy link

ioritree commented Mar 30, 2024

ありがとうございます。
OCRの内容を取り込んだ後、自動的にコピーする機能はないのですか?

取りするたびに新しいウィンドウがポップアップするので、ウィンドウを固定している場合はすべてを閉じる必要はない。

@bigbamboo-jp
Copy link
Owner

ご提案ありがとうございます。

現在のところ、読み取り結果を確認した上でコピーするという形を取っていますが、ソースコード的には即クリップボードにコピーするということも可能です。

その場合申し訳ないですが、その設定画面の項目及び設定内容に連動した挙動の変更のコードをサンプルとして作って頂き(少なくとも英語版の言語データはご準備ください)、それをプルリクエストという形でご提示ください。

以上、よろしくお願いします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants