タイトル : 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 */ |