デスクトップ全体のサイズを調べるにはどうすればよいですか? 「作業領域」「画面解像度」はいずれも1つの画面しか参照していません。私は、各モニタが一部しか表示していない仮想デスクトップの幅と高さの合計を調べたいと思います。C#:デスクトップの完全なサイズを取得しますか?
答えて
あなたは2つのオプションがあります。
をPresentationFramework.dll
SystemParameters.VirtualScreenWidth SystemParameters.VirtualScreenHeight
システム。Windows.Forms.dll
SystemInformation.VirtualScreen.Width SystemInformation.VirtualScreen.Height
あなたがWPFアプリケーションを開発する場合最初のオプションを使用してください。
このような回答の詳細短く、正確で、美的に喜ばしい! – Bitterblue
この回答を最新のものにして、LINQを少し入れてみてください.1つの表現でデスクトップサイズ全体を簡単に取得できます。
Console.WriteLine(
Screen.AllScreens.Select(screen=>screen.Bounds)
.Aggregate(Rectangle.Union)
.Size
);
私のオリジナルの答えは次のとおりです。
int minx, miny, maxx, maxy;
minx = miny = int.MaxValue;
maxx = maxy = int.MinValue;
foreach(Screen screen in Screen.AllScreens){
var bounds = screen.Bounds;
minx = Math.Min(minx, bounds.X);
miny = Math.Min(miny, bounds.Y);
maxx = Math.Max(maxx, bounds.Right);
maxy = Math.Max(maxy, bounds.Bottom);
}
Console.WriteLine("(width, height) = ({0}, {1})", maxx - minx, maxy - miny);
、これは全体の話をしていないことに注意してください:
私はあなたが何をしたいと思い、このようなものです。複数のモニタを互い違いにしたり、非矩形に配置することは可能です。したがって、(minx、miny)と(maxx、maxy)の間の空間のすべてが可視であるわけではない可能性があります。
はEDIT:
私はちょうどRectangle.Union
を使用してコードを少し簡単になることができることを実現:
Rectangle rect = new Rectangle(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue);
foreach(Screen screen in Screen.AllScreens)
rect = Rectangle.Union(rect, screen.Bounds);
Console.WriteLine("(width, height) = ({0}, {1})", rect.Width, rect.Height);
私はウクライナのプログラマーです。私は、このコードがボックスから機能していることを確認しています。コピー&ペーストするだけです。 –
これは質問に答えていませんが、単にウィンドウのポイントに追加の洞察を追加します(場所)をすべての画面内に表示します)。
ポイント(たとえば、最後にわかったウィンドウの場所)がデスクトップ全体の範囲内にあるかどうかを確認するには、次のコードを使用します。そうでない場合は、ウィンドウの場所をデフォルトのにリセットします。pBaseLoc;
コードはTaskBarやその他のツールバーを考慮していません。
使用例:ステーションAからデータベースにウィンドウの場所を保存します。ユーザーはステーションBに2台のモニターを使用してログインし、2台目のモニターに移動して新しい場所を保存してログアウトします。 ステーションAに戻ると、上記のコードを使用しない限りウィンドウが表示されません。
ユーザーIDとステーションのIP(& winLoc)を特定のアプリケーションのデータベースまたはローカルユーザーのprefsファイルに保存してから、そのステーション& appのユーザーprefに読み込みます。
Point pBaseLoc = new Point(40, 40)
int x = -500, y = 140;
Point pLoc = new Point(x, y);
bool bIsInsideBounds = false;
foreach (Screen s in Screen.AllScreens)
{
bIsInsideBounds = s.Bounds.Contains(pLoc);
if (bIsInsideBounds) { break; }
}//foreach (Screen s in Screen.AllScreens)
if (!bIsInsideBounds) { pLoc = pBaseLoc; }
this.Location = pLoc;
これが質問に答えることができないことを知っている場合は、なぜその質問に対する回答として投稿していますか?最初の文が警鐘を発したはずはありませんか? – Timwi
これに対して、これは正確に私がこのトピックを検索したときに探していたものです –
チェック:
SystemInformation.VirtualScreen.Width
SystemInformation.VirtualScreen.Height
範囲はSystem.Drawing
です。
次のような変数にこの
public System.Windows.Form.Screen[] GetScreens(){
Screen[] screens = Screen.AllScreens;
return screens;
}
、あなたがスクリーン1を得ることができるよりも、2、などのような関数を作成することができます
System.Windows.Form.Screen[] screens = func.GetScreens();
System.Windows.Form.Screen screen1 = screens[0];
、あなたが境界を得ることができます
System.Drawing.Rectangle screen1Bounds = screen1.Bounds;
このコードを使用すると、Width
のようなすべてのプロパティが表示されます。 、Height
など
この方法では、左とトップの最安値を使用して画面を境界のすべてが含まれている四角形を返し、右と下の最高値...
static Rectangle GetDesktopBounds() {
var l = int.MaxValue;
var t = int.MaxValue;
var r = int.MinValue;
var b = int.MinValue;
foreach(var screen in Screen.AllScreens) {
if(screen.Bounds.Left < l) l = screen.Bounds.Left ;
if(screen.Bounds.Top < t) t = screen.Bounds.Top ;
if(screen.Bounds.Right > r) r = screen.Bounds.Right ;
if(screen.Bounds.Bottom > b) b = screen.Bounds.Bottom;
}
return Rectangle.FromLTRB(l, t, r, b);
}
少し説明してください。 –
すべての画面をループします。左端が変数 'l'より小さい場合、この新しい値に 'l'を設定します。下端が 'b'より大きい場合は、それを設定します。最終的な結果は、l、t、r、bが、表示されるデスクトップ全体の左上、上端、右端、および下端に設定されます。 – dynamichael
「本当の」画面サイズを得る最良の方法は、ビデオコントローラから直接値を取得することです。
using System;
using System.Management;
using System.Windows.Forms;
namespace MOS
{
public class ClassMOS
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_VideoController");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("CurrentHorizontalResolution: {0}", queryObj["CurrentHorizontalResolution"]);
Console.WriteLine("-----------------------------------");
Console.WriteLine("CurrentVerticalResolution: {0}", queryObj["CurrentVerticalResolution"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}
}
これは、仕事をする必要があります;) 挨拶...
をあなたはこれを使用することができ、モニタの物理的なピクセルサイズを取得するには。
static class DisplayTools
{
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
private enum DeviceCap
{
Desktopvertres = 117,
Desktophorzres = 118
}
public static Size GetPhysicalDisplaySize()
{
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int physicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.Desktopvertres);
int physicalScreenWidth = GetDeviceCaps(desktop, (int)DeviceCap.Desktophorzres);
return new Size(physicalScreenWidth, physicalScreenHeight);
}
}
- 1. c# "#"で完全なURLを取得
- 2. 完全なC++コンパイラコマンドラインを取得
- 3. プログラムの完全な構造を取得しますか?
- 4. クラスの完全修飾名を取得しますか?
- 5. コントローラとアクションの完全修飾URLを取得しますか?
- 6. 完全なCSSで結晶レポートの完全なHTMLコードを取得
- 7. ExtJsのコンボボックスから完全なモデルオブジェクトを取得していますか?
- 8. Facebookはどのようにローカルファイルの完全なパスを取得しますか?
- 9. jdbcのメタデータオブジェクトから完全な列名を取得する
- 10. ModelMetadataを使用して完全なプロパティ名を取得する
- 11. iframeに別のドメインからの完全なURLを取得
- 12. 子コントロールから完全なリソースパスを取得する方法は?
- 13. wiresharkから完全なURLを取得する
- 14. exec.Commandから完全なStdoutを取得するには?
- 15. DOMXPath :: query()メソッドから完全なHTMLを取得するには?
- 16. Webサービスから不完全なxmlデータを取得する
- 17. SPWEBから完全なURLを取得する方法
- 18. XML DOMオブジェクトから完全なXMLソースを取得する
- 19. Valgrindから完全なコールスタックを取得するには?
- 20. Node.jsネットライブラリ: 'data'イベントから完全なデータを取得する
- 21. RSSデータのリンクから完全な情報を取得
- 22. pythonのネットワークドライブ文字から完全なコンピュータ名を取得
- 23. Macデスクトップのサイズを取得する方法
- 24. 不完全な型のC++
- 25. JDTを使用して完全なメソッド名を取得
- 26. javascriptを使用して完全なURL履歴を取得
- 27. Typeに対して完全なC#宣言を得るには?
- 28. Perl:SOAP :: WSDLオブジェクトからの完全なリクエストの取得
- 29. C#:ソフトリンクファイルのサイズを取得
- 30. 私はレジストリから完全なコマンドライン文字列を取得すると、完全なコマンドライン
"デスクトップの完全サイズ"は、画面の配置方法によって異なる場合があります。それを計算する方法はわかりませんが、System.Windows.Forms.Screen.AllScreensを使用して各画面の数と解像度を把握することができます。 – Havenard