tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^9: メモ帳のカーソル位置
投稿日: 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 に該当します。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。