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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

598閲覧

Unityでマルチディスプレイを認識せず、大きな一つのディスプレイとしての情報を取得していまう

namari82

総合スコア11

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2023/08/10 09:25

実現したいこと

Unityにおいてディスプレイの情報を取得したい。

前提

https://qiita.com/kewpie134134/items/bbdc49dc38fe84a48c1a
こちらの記事を参考にして、ディスプレイの情報を取得しました。

発生している問題・エラーメッセージ

Unityにおいて、マルチディスプレイであるにも関わらず大きな一つのディスプレイとして認識してしまいます。
この現象はC#のWindowsフォームアプリケーションとして新たに作ったテストプロジェクトでは起きない現象です。
Unityとテストプロジェクトにおいて、使っている関数は全く同じものです。

Unityの取得情報
こちらがUnityにおける取得情報。



C#のNET Frameworkによるテスト
こちらがテストプロジェクトにおける取得情報。

 


現在のマルチディスプレイ状況
現在のマルチディスプレイ状況



該当のソースコード

C#,Unity

1 using System.Windows.Forms; 2 3 /// <summary> 4 /// 全てのディスプレイの情報取得 5 /// </summary> 6 private String GetAllDisplayInformation() 7 { 8 String displayMainTitle = ""; 9 String displayDeviceName = ""; 10 String displayBoundsX = ""; 11 String displayBoundsWidth = ""; 12 String displayWorkingAreaX = ""; 13 String displayWorkingAreaWidth = ""; 14 String displayEnd = ""; 15 String messages = ""; 16 17 try 18 { 19 displayMainTitle = "\n-----\n●全てのディスプレイの情報取得"; 20 foreach (System.Windows.Forms.Screen screen_data in System.Windows.Forms.Screen.AllScreens) 21 { 22 displayDeviceName = "\nデバイス名 : " + screen_data.DeviceName; 23 displayBoundsX = "\nディスプレイの位置 : X=" + screen_data.Bounds.X + " - Y=" + screen_data.Bounds.Y; 24 displayBoundsWidth = "\nディスプレイのサイズ : 幅=" + screen_data.Bounds.Width + " - 高さ=" + screen_data.Bounds.Height; 25 displayWorkingAreaX = "\nディスプレイの作業領域の位置 : X" + screen_data.WorkingArea.X + " - Y=" + screen_data.WorkingArea.Y; 26 displayWorkingAreaWidth = "\nディスプレイの作業領域のサイズ : 幅" + screen_data.WorkingArea.Width + " - 高さ=" + screen_data.WorkingArea.Height; 27 displayEnd = "\n-----"; 28 29 messages += displayDeviceName + displayBoundsX + displayBoundsWidth + displayWorkingAreaX + displayWorkingAreaWidth + displayEnd; 30 31 } 32 } 33 catch 34 { 35 } 36 return displayMainTitle + messages; 37 }

試したこと

友人に別のマルチディスプレイ環境のPCで試してもらったところ同じ現象が起きました。

補足情報(FW/ツールのバージョンなど)

Unity 2021.3.28f1
Visual Studio 2019

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

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

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

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

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

YAmaGNZ

2023/08/10 11:50

System.Windows.Forms.dllはどこから持ってきましたか? こちらでぱっと試した感じUnity(MONO)のほうから持ってくると統合されたモニターが1つ、Windowsのほうから持ってくるとマルチモニターで情報が取得できました。
namari82

2023/08/10 12:30

完全にUnityから持ってきました!!! 試してみます!!!
YAmaGNZ

2023/08/10 14:05

コンパイル後にDLLをWindowsの物に上書きしてもOKでした。
namari82

2023/08/15 08:11

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5 こちらからwindowsのv4.5のものを持ってきましたが、 Loading assembly failed: "Assets/Plugins/System.Windows.Forms.dll" reason: File does not contain a valid CIL image とのエラーが発生しました。 YAmaGNZさんはどちらから持ってきましたか? またEditor上でも動きました?
YAmaGNZ

2023/08/15 11:04

私は「C:\Windows\Microsoft.NET\Framework\v4.0.30319」にあった.NET Framework4.8のものを使用しました。 この時、エディタ上では実行できましたがコンパイルは通りませんでした。 なので、一度Unityのものでコンパイルを通してから出力されたものに上記のDLLを上書きしたところ動作し、モニタ情報も取得できました。 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFrameworkから持ってきたところ仰るようにエラーが出てエディタで動作させてもモニタ情報は取得できていませんでした。 当方Unityはほぼさわっていないので正当な方法がどのようなものかもいまいち理解しきれていません。
namari82

2023/08/16 01:17

できました!!! 一度コンパイル通ってから上書きする形で動きました。 なぜこんな流れでできるのか意味は分かりませんが…。 ありがとうございます!
guest

回答1

0

自己解決

YAmaGNZさんの質問より解決

System.Windows.Forms.dllをUnityのものでなくWindowsの方より持ってくると成功する。
そのままPluginsフォルダにWindowsのSystem.Windows.Forms.dllを持ってくると
Loading assembly failed: "Assets/Plugins/System.Windows.Forms.dll" reason: File does not contain a valid CIL image
とのエラーが発生してしまう。

このためにまず一度Unityの「C:\Program Files\Unity\Hub\Editor\2022.1.23f1\Editor\Data\MonoBleedingEdge\lib\mono\4.5」をPluginsフォルダに入れて、コンパイルを通してから(Unityにおけるコンパイルは普通ファイルを入れてUnityをアクティブにすれば自動で行われる)「C:\Windows\Microsoft.NET\Framework\v4.0.30319」にあったSystem.Windows.Forms.dllをUnity非アクティブ状態で上書きすればエラーを回避して複数のウィンドウを取得できた。

投稿2023/08/16 01:23

namari82

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問