タイトル | : Re^9: メモ帳のカーソル位置 |
記事No | : 15525 |
投稿日 | : 2012/07/09(Mon) 17:04 |
投稿者 | : 魔界の仮面弁士 |
>> FindWindowEx APIのことでしょうか。 > そのとおりです。 > やはりカーソルは動きません。 No15521 のサンプルコードにおいて、メモ帳をドラッグ移動して、 右画面に置いてからボタンを押したときと、 左画面に置いてからボタンを押したときとで 結果が異なるかどうかを確認しておいてください。
画面位置によって結果が異なるのであれば、マルチモニタ対応も意味がありますが、 画面位置と無関係なのであれば、モニタ解像度を得ても改善できないように思います。
> ところで、右モニタの左上の座標って それぞれのモニタを列挙して画面領域を調べてみてください。たとえばトリプルモニタ構成で、 ┏━━━┯━━━┯━━━┓-880 ┃***│ │***┃ A: 800x 600 [横置き]: (0, 0)-(800, 600) ┃***│ │***┃ B:1680x1050 [横置き]: (800, 400)-(2480, 1450) ┃***│ │***┃ C: 800x1280 [縦置き]: (800, -880)-(1600, 400) ┠───┤ C │***┃0 ┃ │ │***┃ ※Aをプライマリモニタとする ┃ A ├───┴───┨400 ┠───┤ ┃600 ┃***│ B ┃ ┃***│ ┃ ┗━━━┷━━━━━━━┛1450 0 800 1600 2480 のような座標配置になっていた場合、「右モニタ」としたいのは B と C のどちらでしょうか。
B の左上座標を得た場合、その座標は (800, 400) となりますし、 C の左上座標という事であれば、(800, -880) ということになりますね。
> 具体的にはどうすればいいのでしょうか? VB6 の場合は、GetMonitorInfo API を使います。 先に紹介した MultiMon サンプル(monitors.vbp) でいえば、 リストボックス(frmSample.lstMonitors)のアイテムを ダブルクリックしたときに表示される矩形情報が該当します。
これが VB.NET であれば、 For Each scr As Screen In Screen.AllScreens Debug.Print(scr.DeviceName) If scr Is Screen.PrimaryScreen Then Debug.WriteLine("プライマリスクリーン") Debug.Print( "Left = " & CStr(scr.Bounds.Left ) ) Debug.Print( "Top = " & CStr(scr.Bounds.Top ) ) Debug.Print( "Right = " & CStr(scr.Bounds.Right ) ) Debug.Print( "Bottom= " & CStr(scr.Bounds.Bottom) ) Debug.Print( "Width = " & CStr(scr.Bounds.Width ) ) Debug.Print( "Height= " & CStr(scr.Bounds.Height) ) Next のようにして簡単に列挙できるのですけれどね。
> SM_CXVIRTUALSCREENの説明書きは左隅の座標ということでこれは0ではないのでしょうか? Virtual-Desktop-Screen とは、各モニタの最も外側の辺に重なる領域の事です。
これは上記テキスト図でいうところの太線部の領域であり、先ほどの例では、 (0, -880)-(2480, 1450) という 2480x2330 の領域を意味します。つまり、 GetSystemMetrics(SM_XVIRTUALSCREEN ) = 0 GetSystemMetrics(SM_YVIRTUALSCREEN ) = -880 GetSystemMetrics(SM_CXVIRTUALSCREEN) = 2480 GetSystemMetrics(SM_CYVIRTUALSCREEN) = 2330 という値が返されるという事です。
> 画面に対する知識がまるでないため#2と返答していましたがどうも違うのでしょうか? 下記の「マルチデスクトップ」「ビッグデスクトップ」「クローンデスクトップ」の違いです。 (どのモードが使えるのかは、お使いの製品によって異なります) http://shop.tsukumo.co.jp/special/050418c/
たとえば、1280x1024 を表示可能なモニタが17インチモニタが2台あるとします。 (このサイズを表示可能なら、実際には物理サイズは違っていても構いません)
このモニタを 2 台とも横置き配置で使う場合、マルチモニタ環境としては (A) 1280x1024 … ミラー(クローン) (B) 2560x1024 … マルチモニタ、またはビッグデスクトップ (C) 1280x2048 … マルチモニタ (D) 上記以外 … マルチモニタ の 4 パターンが考えられます。
(A) は、アプリケーションからは 1280x1024 が 1 つだけあるように見えます。 デスクトップサイズ … 1280x1024 モニタ数 = 1 1: 1280x1024 : (0, 0)-(1280, 1024) 一方のモニタがオフラインの場合も、この状態となりますね。
(B)/(C)は、縦または横に並べた場合のパターンです。 たとえば (B) の場合、メイン画面が左側にある場合は、 デスクトップサイズ … 2560x1024 モニタ数 = 2 1: 1280x1024 : (0, 0)-(1280, 1024) 2: 1280x1024 : (1280, 0)-(2560, 1024) となり、また、メイン画面が右側にある場合は、 デスクトップサイズ … 2560x1024 モニタ数 = 2 1: 1280x1024 : (0, 0)-(1280, 1024) 2: 1280x1024 : (-1280, 0)-(0, 1024) という座標系になります。
そして B の『ビッグデスクトップ』モードの場合、アプリケーションからは デスクトップサイズ … 2560x1024 モニタ数 = 1 1: 1280x1024 : (0, 0)-(2560, 1024) という構成に見えます。今回の例では 1280x1024 の横置き 2 枚の構成ですが、 縦置きの左右構成なら、2480x1280 構成のデスクトップになります。
ビッグデスクトップでは、それぞれの画面の論理解像度と色数が 完全に一致している必要があります。
なお (D) は、非矩形のレイアウトであり、それぞれの画面サイズが 異なっているため、ビッグデスクトップになれません。これは ┏━━━━━┯━━━━━━━┓ ┃*****│ ┃デスクトップサイズ … 2480x1050 ┠─────┤ ┃モニタ数 = 2 ┃ │ ┃ 1: 1680x1050 : [横置き]: (0, 0)-(1680, 1050) ┃ 画面2 │ 画面1 ┃ 2: 800x 600 : [横置き]: (-800, 450)-(0, 1050) ┃ │ ┃ ┗━━━━━┷━━━━━━━┛ のように左右で違う解像度のパターンの他、接する辺の長さが一緒であっても、 ┏━━━━━┯━━━━━━━┓ ┃ │ ┃ ┃ 1 │ ┃デスクトップサイズ … 2480x1024 ┃ 縦 │ 2 ┃モニタ数 = 2 ┃ 置 │ 横置き ┃ 1: 768x1024 : [縦置き]: (0, 0)-(768, 1024) ┃ き │ ┃ 2: 1280x1024 : [横置き]: (768, 0)-(2048, 1024) ┃ │ ┃ ┗━━━━━┷━━━━━━━┛ のような構成の場合も、パターン D に該当します。
|