セカンダリディスプレイでフルスクリーン表示

マルチモニタ環境でセカンダリディスプレイへウィンドウを表示し、初期状態でフルスクリーン表示する方法がうまくいかず、位置がずれたり表示が壊れたりしたため、どうすべきか調べました。

ウィンドウを表示するタイミングは、メインウィンドウのボタン押下時です。その時にフルスクリーン表示したいウィンドウを生成しようとチャレンジしてました。

基本的には、以下の流れで処理できるようです。

// ウィンドウの生成
var win = new FullWindow();
// セカンダリディスプレイの左上をウィンドウの位置とする
// monitorはディスプレイ番号でセカンダリを表すものとする
win.Left = System.Windows.Forms.Screen.AllScreens[monitor].WorkingArea.X;
win.Top = System.Windows.Forms.Screen.AllScreens[monitor].WorkingArea.Y;
// ウィンドウの表示
win.Show();
// ウィンドウのフルスクリーン表示
win.WindowState = WindowState.Maximized; // ウィンドウをフルスクリーン表示にする
win.WindowStyle = WindowStyle.None; // ウィンドウの境界線スタイルを無しにする
win.ShowInTaskbar = false; // タスクバーを非表示にする

ところがこれだけですと、プライマリディスプレイでは簡単に動いたのですが、どうもプライマリディスプレイが高DPIモニタであることが影響して、違うディスプレイに表示されたり、フルスクリーン表示が壊れ、中途半端なサイズのウィンドウが表示される、という不思議な現象に遭遇しました。

そのため、問題点は2点あると予想しました。

  1. ウィンドウ位置の高DPI対応しないといけない
  2. ウィンドウのフルスクリーン表示設定タイミングを変更することが必要

いろいろ悩んだ挙句ですが、問題なのはプライマリが高DPIであることに限定し、win.Leftとwin.Topを設定する際に、プライマリのdpiを計算することにしました。なお、デフォルトのdpiは96であると仮定しています。

double dpi = PresentationSource.FromVisual(Application.Current.MainWindow).CompositionTarget.TransformFromDevice.M11;
win.Left = (int)((double)Screen.AllScreens[monitor].WorkingArea.X * dpi);
win.Top = (int)((double)Forms.Screen.AllScreens[monitor].WorkingArea.Y * dpi);

また、フルスクリーン表示の設定をするタイミングもLoadedイベントにすれば解決するかと思ったのですが、どうも違うようでしたので、SourceInitializedを使用しました。

win.SourceInitialized += (sender, arg) => {
    win.WindowState = WindowState.Maximized; // ウィンドウをフルスクリーン表示にする         
    win.WindowStyle = WindowStyle.None; // ウィンドウの境界線スタイルを無しにする    
    win.ShowInTaskbar = false; // タスクバーを非表示にする
};

これらコードは、実際に動かしたものではないですが、手持ちの環境では、こうした対応で、動作を確認できました。

Visual Studio 2017 ASP.NETでビルド構成別にconfigを切り替える方法

Visual Studio 2017 で ASP.net MVC のプロジェクトをビルド構成別にconfigを切り替える方法として、Web.[ビルド構成].Config を使用する方法があります。
これを行うには、Visual Studio拡張のConfiguration Transformを利用することで、簡単にファイルを用意することができ、またプレビュー確認もできます。

しかしながらこのビルド構成別切り替えは、発行時にのみ適用されるもので、Web.Debug.configのように開発時だけ適用したいという用途があっても、これだけではconfigが切り替えられることはありません。そこで調べてみたところ、プロジェクトファイルを編集することで、Visual Studioでのビルド時にも対応可能であることがわかりました。(参考

“Visual Studio 2017 ASP.NETでビルド構成別にconfigを切り替える方法” の続きを読む

Redmine 4.3.2にアップデートで LoadError redcloth3 エラー

Redmineを4.3.2にアップデートしようとしたら、DBマイグレーションで以下のエラーが発生しました。

$ bundle exec rake db:migrate RAILS_ENV=production
rake aborted!
LoadError: cannot load such file — redcloth3

エラーにも書いてあったんですが、原因はredmine_wiki_extensionが対応してなかったのが問題でした。これを最新にアップデートしたら治ったようです。

Pydi(AjaXplorer) Version 5.2.3 でダウンロードしたzip内の日本語文字化けをなんとかする

Windows7からヘッダ情報がUTF-8で書き出されたzipも解凍できるようになったはずなんですが、Pydiを使っているとどうも文字化けが発生します。かといって、S-JISに変換するように直してしまうのも時代の流れから言って微妙なので、ちゃんと読めるようにしてみました。

内容は、zipのUTF-8オプションビットを立てるようにする!というものです。

“Pydi(AjaXplorer) Version 5.2.3 でダウンロードしたzip内の日本語文字化けをなんとかする” の続きを読む