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

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

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

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