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

タイトル Re^5: メモ帳のカーソル位置
投稿日: 2012/07/06(Fri) 17:29
投稿者魔界の仮面弁士
> それはマルチモニターです。
当方もマルチモニター環境です(Win7 x64)。
検証してみたいので、現象を再現可能な最低限の実験コードを提示できますか?


> サブ画面に開くのですが
一方がメイン画面、他方がサブ画面という構成なのですね。

# すべてのモニタに同じ画面を表示する設定(ミラー)とか、
# 2 画面合わせて 1 つの広いデスクトップとするモードが
# 使われているケースもありますので、念のため確認…。


> その場合SendMessageが使えません。
SendMessage の呼出し後、Err.LastDLLError は何を返してきますか?



> マルチモニタでの開発環境がないのでハンドルが拾えているのかどうかも確認できない状態です。
この場合のハンドルとは、Window Handle (HWND) のことかと思いますが、
操作対象としているメモ帳の HWND は、どのようにして取得してますか?
また、取得した HWND の値がゼロになってはいませんか?


> ちなみに、左モニタが19インチ縦置き、右モニタが17インチ横置きです。
モニタの物理サイズではなく、論理解像度はどのようになっていますか?
(左が長辺1920x短辺1080、右が長辺1280x短辺1024 など)

また、左右どちらをメインモニタにしているのでしょうか。
(右がメインモニタなら、左側はマイナス座標系ということになります)

また、それぞれの画面の(論理上の)配置はどうなっているのでしょうか。

┌───┐       ┌───┬───┐ 
│   │下辺合わせ  │   │   │ 
│   ├───┐   │   │   │ 
│   │   │   │   ├───┘ 
│   │   │   │   │上辺合わせ
└───┴───┘   └───┘     
                      
            ┌───┐     
┌───┐       │   │     
│   ├───┐   │   │     
│   │   │   │   ├───┐ 
│   │   │   │   │   │ 
│   ├───┘   └───┤   │ 
└───┘上下端が一致していない└───┘ 



> 右モニタの左上隅の座標を拾ってそこに指定して開くことはかのうでしょうか?
CreateProces API あるいは Win32_Process.Create メソッドを使えば
「起動時」に座標指定ができますが…メモ帳はこの設定を無視します。

strCommand = "notepad.exe"
strCommand = "cmd.exe"
currentDirectory = Environ("TEMP")

Set w = GetObject("winmgmts:")
Set ps = w.Get("Win32_ProcessStartup").SpawnInstance_
ps.ShowWindow = VBAppWinStyle.vbNormalFocus
ps.X = 50
ps.Y = 50
ps.XSize = 300
ps.YSize = 300
Set proc = w.Get("Win32_Process")

outProcId = 0
ret = proc.Create(strCommand, currentDirectory, ps, outProcId)

Debug.Print ret, outProcId


そのため、起動後に MoveWindow API で移動することになりそうです。


指定する座標については、デスクトップ全体のサイズは GetSystemMetrics API
http://www.gizcollabo.jp/vbtomo/log/archive/vbqanda_6678_0.html
各モニタの情報については、EnumDisplayMonitors API でどうぞ。
http://support.microsoft.com/kb/194578/

> たとえばSM_XXXなどですが、
Const SM_XVIRTUALSCREEN    As Long = 76
Const SM_YVIRTUALSCREEN    As Long = 77
Const SM_CXVIRTUALSCREEN   As Long = 78
Const SM_CYVIRTUALSCREEN   As Long = 79
Const SM_CMONITORS         As Long = 80
Const SM_SAMEDISPLAYFORMAT As Long = 81
などについては、上記VB6サンプルに記載されていますね。

> この値はどこを調べればいいのでしょうか?
Platform SDK 付属の「C 言語用のヘッダーファイル」です。

たとえば上記の定数であれば、"MultiMon.h" というファイルにて

#define SM_XVIRTUALSCREEN       76
#define SM_YVIRTUALSCREEN       77
#define SM_CXVIRTUALSCREEN      78
#define SM_CYVIRTUALSCREEN      79
#define SM_CMONITORS            80
#define SM_SAMEDISPLAYFORMAT    81

などと記述されていますし、前回の回答にあった「EM_SETSEL」なら "WinUser.h" ファイルです。

#define EM_GETSEL               0x00B0
#define EM_SETSEL               0x00B1
#define EM_GETRECT              0x00B2
#define EM_SETRECT              0x00B3
#define EM_SETRECTNP            0x00B4
#define EM_SCROLL               0x00B5
#define EM_LINESCROLL           0x00B6
#define EM_SCROLLCARET          0x00B7
#define EM_GETMODIFY            0x00B8
#define EM_SETMODIFY            0x00B9
#define EM_GETLINECOUNT         0x00BA
#define EM_LINEINDEX            0x00BB
#define EM_SETHANDLE            0x00BC
#define EM_GETHANDLE            0x00BD
#define EM_GETTHUMB             0x00BE
#define EM_LINELENGTH           0x00C1
#define EM_REPLACESEL           0x00C2
#define EM_GETLINE              0x00C4
#define EM_LIMITTEXT            0x00C5
#define EM_CANUNDO              0x00C6
#define EM_UNDO                 0x00C7
#define EM_FMTLINES             0x00C8
#define EM_LINEFROMCHAR         0x00C9
#define EM_SETTABSTOPS          0x00CB
#define EM_SETPASSWORDCHAR      0x00CC
#define EM_EMPTYUNDOBUFFER      0x00CD
#define EM_GETFIRSTVISIBLELINE  0x00CE
#define EM_SETREADONLY          0x00CF
#define EM_SETWORDBREAKPROC     0x00D0
#define EM_GETWORDBREAKPROC     0x00D1
#define EM_GETPASSWORDCHAR      0x00D2
#if(WINVER >= 0x0400)
#define EM_SETMARGINS           0x00D3
#define EM_GETMARGINS           0x00D4
#define EM_SETLIMITTEXT         EM_LIMITTEXT   /* ;win40 Name change */
#define EM_GETLIMITTEXT         0x00D5
#define EM_POSFROMCHAR          0x00D6
#define EM_CHARFROMPOS          0x00D7
#endif /* WINVER >= 0x0400 */

#if(WINVER >= 0x0500)
#define EM_SETIMESTATUS         0x00D8
#define EM_GETIMESTATUS         0x00D9
#endif /* WINVER >= 0x0500 */

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

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