タイトル : Re^7: メモ帳のカーソル位置 投稿日 : 2012/07/09(Mon) 12:09 投稿者 : 魔界の仮面弁士
>>>> EM_SETSEL メッセージの場合、wParam が開始位置、lParam が選択文字列の長さです。 ごめんなさい! 間違えてました。lParam は終了位置です。 たとえば 5文字目から3文字選択して8文字目までであれば、 wParam = 5、lParam = 3 ではなく、wParam = 5、lParam = 8 とします。 なので通常は wParam≦lParam となるはずです。 (OS によっては、sParam>lParam だと「後ろから前への選択」になることもあるようですが) > すみません、# 2 画面合わせて 1 つの広いデスクトップとするモードです ウィンドウを最大化すると、片方の画面内だけで最大化されるモード (タスクバーはメイン画面のみに表示されている状態)ではなく、 ウィンドウを最大化すると、両画面にまたがって最大化されるモード (タスクバーは2つの画面にまたがって表示されている状態)ということですね。 ミラーモードや、広いデスクトップとするモードの場合、アプリケーション側にとっては マルチモニタとしては認識されていません。ひとつのデスクトップとして扱われます。 アプリケーション側でマルチモニタとして処理されるのは、上記でいう所の 「ウィンドウを最大化すると、片方の画面内だけで最大化されるモード」の時だけです。 >> 操作対象としているメモ帳の HWND は、どのようにして取得してますか? > #1 Windowタイトルからメモ帳のウィンドウハンドルを拾いそこからChildWindowのWindowHandleを 拾っています。 FindWindowEx APIのことでしょうか。当方でテストしてみたところ、 メモ帳の位置によって動作が変わってしまう事はありませんでした。 Option Explicit Private Declare Function GetDesktopWindow Lib "user32" () As OLE_HANDLE Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExW" _ ( _ ByVal hwndParent As OLE_HANDLE, _ ByVal hwndChildAfter As OLE_HANDLE, _ ByRef lpszClass As Any, _ ByRef lpszWindow As Any _ ) As OLE_HANDLE Private Const EM_SETSEL As Long = &HB1& Private Declare Function SendMessage Lib "user32" Alias "SendMessageW" _ ( _ ByVal hWnd As OLE_HANDLE, _ ByVal msg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long _ ) As Long Private Const WM_VSCROLL As Long = &H115& Private Const SB_BOTTOM As Long = &H7& Private Sub Form_Load() Text1.Text = "無題 - メモ帳" Label1.Caption = "0" Label2.Caption = "0" Command1.Caption = "テスト" Dim dbl As Double dbl = Shell("notepad", vbNormalNoFocus) Debug.Print dbl End Sub Private Sub Command1_Click() Dim hwndDesktop As OLE_HANDLE ' hwndDesktop = GetDesktopWindow() Dim className() As Byte className = "Notepad" & vbNullChar Dim windowTitle() As Byte windowTitle = Text1.Text & vbNullChar Dim hWndNotepad As OLE_HANDLE 'hWndNotepad = FindWindowEx(hwndDesktop, 0&, className(0), ByVal 0&) hWndNotepad = FindWindowEx(hwndDesktop, 0&, ByVal 0&, windowTitle(0)) Label1.Caption = Hex(hWndNotepad) Label2.Caption = "0" If hWndNotepad = 0& Then MsgBox "該当する親ウィンドウが見つかりませんでした。" & vbCrLf _ & "LastDllError=" & CStr(Err.LastDllError), vbInformation Exit Sub End If Dim hWndEditBox As OLE_HANDLE className = "Edit" & vbNullChar hWndEditBox = FindWindowEx(hWndNotepad, 0&, className(0), ByVal 0&) Label2.Caption = Hex(hWndEditBox) If hWndEditBox = 0& Then MsgBox "子ウィンドウが見つかりませんでした。" & vbCrLf _ & "LastDllError=" & CStr(Err.LastDllError), vbInformation Exit Sub End If Dim result As Long Dim nStart As Long, nEnd As Long nStart = &H7FFFFFFF nEnd = &H7FFFFFFF result = SendMessage(hWndEditBox, EM_SETSEL, nStart, nEnd) 'おまけ:スクロールバー制御 result = SendMessage(hWndEditBox, WM_VSCROLL, SB_BOTTOM, ByVal CLng(0)) End Sub |