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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

.NET Framework

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

1回答

4907閲覧

映像(HDMI)出力を制御したい

kawauso

総合スコア56

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

.NET Framework

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

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2019/08/22 00:32

お世話になります。

行いたいこと
・C# WPFアプリケーション
・HDMI出力で映像を制御したい。

PCにHDMI出力が2つ以上あると仮定します。(HDMI1,HDMI2,…とします)
・HDMI1にはディスプレイを接続しC# WPFで作成したGUIを表示します。
・HDMI2にはプロジェクタなどを接続してHDMI1のGUIでの設定に応じて映像を出力します。
・HDMI3にはGUIのサブディスプレイ用としてディスプレイなどが接続される可能性があります。

1つの案として考えられるのが、下記ですが
・GUIが起動した際にサブディスプレイを探しモードレスウィンドウを生成し制御

問題点として以下が考えられます。
・HDMI1のGUIを最小化した際にHDMI2のモードレスウィンドウも最小化されてしまう。
・HDMI3などに別のモニターなどが接続されていた場合にHDMI2に接続されている機器をどう判別するか
(以前調べた際にディスプレイ名では指定できず、メインディスプレイか否かと解像度などで判断するしかないような記事があったように記憶しています。)
・HDMI2にはマウスポインタの侵入を制御したい。HDMI1と3は自由に移動させたい。

私の理想としては、HDMI2をディスプレイとして扱うのではなく
ユーザーが映像出力のプログラミング可能なハードウェアなどがあれば…と考えます。
そのようなものがあれば上記の問題点は解決できると考えます。

質問
・上記のようなハードウェアはあったりするでしょうか。
・または、C#に限らずソフト上で直接映像を生成してHDMI出力できる方法はありますでしょうか。
ない場合
・上記の問題点を解決できるようなテクニックがあればご提示いただければ幸いです。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

こんにちは。「質問」に対する回答ではありませんが・・・

・HDMI1のGUIを最小化した際にHDMI2のモードレスウィンドウも最小化されてしまう。

手元で試した感じ、そうはなりませんでした。
(親子関係が設定されているとなるかもしれませんが、どちらもトップレベルウィンドウでしたらならないのではないかと。)

イメージ説明

・HDMI3などに別のモニターなどが接続されていた場合にHDMI2に接続されている機器をどう判別するか

(以前調べた際にディスプレイ名では指定できず、メインディスプレイか否かと解像度などで判断するしかないような記事があったように記憶しています。)

ここの部分の懸案はちょっとよく理解していませんが、ディスプレイ識別子のようなものは無かった気がするので、
とりあえずはデバイス名などで当てにいくしかないかもしれません。

・HDMI2にはマウスポインタの侵入を制御したい。HDMI1と3は自由に移動させたい。

力技ですが、HDMI2にマウスポインタが入ったら、マウスポインタをうまくワープさせてやれば、
それらしい事は実現できそうです。
マウスポインタを表示しない+クリックイベントで何もしない、というようんな実装でもいいような気もしますが・・・・

投稿2019/08/22 01:20

takabosoft

総合スコア8356

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

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

kawauso

2019/08/22 04:27

こんにちは。ご回答ありがとうございます。 ウィンドウ最小化の件ですが、私がテストした際は親子関係が設定されていたため、どちらも最小化されてしまっていたようです。 モニターのデバイス名の件ですが、下記のWMIを使用する場合でNameなどが取得できることが確認できました。 (System.Windows.Formsを使用する場合ではDISPLAY1などの名前しか取得できませんでした。) https://ja.stackoverflow.com/questions/38033/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4%E3%81%AE%E8%AD%98%E5%88%A5%E7%95%AA%E5%8F%B7%E3%82%92c%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B しかし、指定したモニターにウィンドウを表示させるにはウィンドウのTopやLeftプロパティにそのモニターの座標を指定してあげる必要が あるようですが、上記の手法で座標取得の方法がわかりませんでした。 ご存知の場合は教えていただければ幸いです。 マウスの件はマウスを見失うということも考慮して前者の方法を検討してみたいと思います。
takabosoft

2019/08/22 05:20 編集

> 座標取得の方法がわかりませんでした。 リンク先の回答を信じればWMIで取れた0番目のディスプレイの矩形はSystem.Windows.Forms.Screen.AllScreens[0].Boundsって事になるんでしょうね。 いくつかディスプレイを抜き差しして検証してみてはどうでしょう。
kawauso

2019/08/23 00:27

ご回答ありがとうございます。 WMIの取得順とSystem.Windows.Forms.Screen.AllScreens[x]およびDeviceNameのインデックスに関係性はなさそうに感じました。 stack overflowの方ですが、ウィンドウのハンドルを渡すことでモニターのDeviceIDが取得できると理解しました。 ウィンドウが表示されていない2つのモニターから特定のモニターを見つけ出したいので少し違うように感じたのですが…見当違いでしょうか? 自分でももう少し調べたいと思います。
takabosoft

2019/08/23 00:30

stackoverflowには期待する関数の完全版は用意されていません。 System.Windows.Forms.Screen.AllScreensで矩形やDisplayNameが取れますが、 このDisplayNameがわかればそれに紐づくDisplayIDが取れるよ、と言いたかっただけです。
kawauso

2019/08/23 02:01

回答ありがとうございます。 モニターを三枚接続した状態で出力してみました。 while (EnumDisplayDevices(null, deviceIndex, ref displayDevice, 0)) { Console.WriteLine("{0} {1} {2} {3} {4} {5}",displayDevice.DeviceID, displayDevice.DeviceKey, displayDevice.DeviceName, displayDevice.DeviceString, displayDevice.StateFlags, displayDevice.cb); deviceIndex++; } 同一グラボの場合、IDは同一になるがキーは異なるとコメントにありましたが、 私の環境ではDeviceNameとStateFlags以外はすべて同一の値が出力され、モニターを特定するのは難しいと思いました。
takabosoft

2019/08/23 05:03

あら、だめでしたか、失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問