DOBON.NETプログラミング道掲示板

No34204 の記事


■34204 / )  Re[1]: 起動ディスプレイの指定方法について
□投稿者/ 魔界の仮面弁士 大御所(1220回)-(2019/04/02(Tue) 13:06:45)
  • アイコン2019/04/02(Tue) 13:37:01 編集(投稿者)

    No34203に返信(masaさんの記事)
    > foreach (Screen s in Screen.AllScreens)
    > {
    >  if (s.Primary)
    Screen.AllScreens を使うよりも
    Screen.PrimaryScreen を使う方が手っ取り早いかと。


    > this.Location = s.Bounds.Location;
    .Bounds.Location ではなく、
    .WorkingArea.Location を使うべきです。

    表示位置を Bounds の左上にしてしまうと、
    タスクバー(あるいはそれに類するウィンドウ)が、
    画面の左端または上端に最前面表示で
    配置されていた場合に問題が生じます。



    > MessageBoxは「現在アクティブなウィンドウ」に起動することは分かっているのですが、
    > このアクティブなウィンドウをメインウィンドウへ変更するようなことは可能なのでしょうか?
    MessageBox.Show の第一引数(IWin32Window 型)に、
    PrimaryScreen 上にあるウィンドウ(Form や NativeWindow など)を
    渡すことで、プライマリ側の画面に表示されると思います。


    もし、PrimaryScreen 側に移動するだけでは不足で、
    その表示位置までも変更したいという要件の場合は、
    少々面倒ですが、API を使って下記の手順で対処することになります。

    SetWindowHookExW API に WH_CBT を指定して自スレッドをフックし、
    それによって通知される CBTProc のコールバックデリゲートにおいて、
    第 1 引数 int nCode が CBT_ACTIVATE (== 5) であった際に、
    第 2 引数 IntPtr wParam で示されるウィンドウハンドルに対して
    SetWindowPos API で位置(必要ならサイズも)指定する感じです。

    フックの後始末のために、UnhookWindowsHookEx API を呼び出すことも忘れずに。

    https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowshookexw
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms644977.aspx
    https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-unhookwindowshookex
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -