4

しばらくの間、WPF アプリケーションを複数のモニターにまたがらせようとしてきましたが、ほぼ機能しています。

次の行を設定すると、問題が発生するようです。

win1.WindowState = WindowState.Maximized

これにより、アプリケーションはプライマリ画面のみにまたがります。

私のコードは次のとおりです。

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        Window1 win1 = new Window1();
        win1.WindowStartupLocation = WindowStartupLocation.Manual;
        win1.Width = 2560;
        win1.Height = 1024;
        win1.Left = 0;
        win1.Top = 0;
        win1.Topmost = true;
        win1.Background = new SolidColorBrush(Colors.Black);
        win1.WindowStyle = WindowStyle.None;
        win1.Show();
        win1.Focus();
    }
}

そして、ウィンドウ 1 の内部:

public partial class Window1 : Window
{
    public Window1()
    {

    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Maximized;
    }
}

この例は機能しますが、ウィンドウは最大化されておらず、アプリケーションの境界線がまだ表示されています。

Application_Startup に最大化された減速を含めると、モニターがプライマリ モニターに最大化されます。

どうしてこれなの?

4

2 に答える 2

12

まず、「最大化」の概念は単一のモニターに関連付けられているため、複数のモニターでウィンドウを最大化することはできません。もちろん、WPF では、独自のウィンドウ フレームを作成し、その中に好きなものを描画できます。そのため、必要に応じて、ウィンドウが最大化され、複数の画面にまたがっているとユーザーに思わせることができます。

また、次の 2 つの場合にのみ、1 つの長方形のウィンドウで 2 つのモニターをまたがることができることに注意してください。

  1. 2 台のモニターが同じ高さで、並べて配置するように構成されている、または
  2. 2 台のモニターの幅は同じで、上下に配置されるように構成されています。

それ以外の場合は、2 つの別々のウィンドウを使用して両方のモニターの表面全体をカバーするか、どのモニターにもカバーされていない領域を含む大きなウィンドウを使用する必要があります。

ウィンドウを配置するために必要な情報を取得する方法は次のとおりです。

WPF 自体は、モニターの数、解像度、または相対位置について尋ねる方法を提供しません。幸いなことに、[DllImport] を使用して Win32 を直接呼び出すことができます。モニターの解像度とレイアウトを取得するには、次のようにします。

  1. C# で MONITORINFO 構造体を構造体として宣言する
  2. User32.dll にある EnumDisplayMonitors と GetMonitorInfo の DllImports を宣言します。
  3. EnumDisplayMonitors を呼び出し、モニター情報を取得してリストで返すデリゲートを渡すメソッドを記述します。

基本的な考え方は次のとおりです。

List<MONITORINFO> GetAllMonitorInfo()
{
  var result = List<MONITORINFO>();
  EnumDisplayMonitors(null, null,
    (hMonitor, hdcMonitor, lprcMonitor, dwData) =>
    {
      var info = new MONITORINFO { cbSize = Marshall.Sizeof(typeof(MONITORINFO)) };
      GetMonitorInfo(hMonitor, ref info);
      result.Add(info);
    }, null);
  return result;
}

モニター座標を取得したら、選択したアルゴリズムを使用して、作成するウィンドウの数と、それぞれに必要な座標を選択します。次に、明示的なサイズと位置を使用してウィンドウを作成します。

スタート メニューなどを上書きしないように、rcMonitor ではなく rcWork を使用することをお勧めします。

また、セカンダリ モニターがプライマリ モニターの左側にある場合など、多くの場合、返される座標の一部が負になることにも注意してください。これは問題ではありません。与えられた座標を使用するだけで、ウィンドウが正しい場所に表示されます。

于 2009-12-24T02:08:33.313 に答える
-1

セカンダリ モニターがプライマリと同じ解像度であると常に想定できる場合は、次のように実装できます。

// Use this is you are concerned about the taskbar height
Rect workArea = SystemParameters.WorkArea;
this.Width = SystemParameters.PrimaryScreenWidth * 2;
this.Height = workArea.Bottom;
this.Left = 0;
this.Top = 0;

または:

// Use this is you don't care about the taskbar height
this.Width = SystemParameters.PrimaryScreenWidth * 2;
this.Height = SystemParameters.PrimaryScreenHeight;
this.Left = 0;
this.Top = 0;
于 2009-12-23T21:11:32.387 に答える