none
VB.NETで外部アプリケーションのアクティブなテキストボックスのカーソルの位置 RRS feed

  • 質問

  • お世話になります。

    VB.NETのアプリケーションから、外部のアクティブなアプリケーションのアクティブになっているテキストボックスやメモ帳のカーソル位置(「|」の部分)を取得するにはどうすればよいでしょうか?

    位置を取得して、横にVB.NETのアプリケーションのウィンドウを移動したいのです。

    マウスの位置しか取れなくて、困っています。

    よろしくお願いいたします。

    2015年4月16日 12:11

回答

  • こんにちは。

    以下を参考にAPIで取得しては。
    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=res&mo=32472&namber=32471&space=15&page=0&no=0/

    帰ったら試してみます。

    追記>
    リンク先を参考にVB.NETへ移植しました。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.TopMost = True
        Timer1.Interval = 3000
        Timer1.Start()
    End Sub
    
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        SetCurrentInput()
    End Sub
    
    Private Sub SetCurrentInput()
        Dim hWnd = GetForegroundWindow()
        Dim current = GetCurrentThreadId()
        Dim target = GetWindowThreadProcessId(hWnd, IntPtr.Zero)
        Dim p As Point
        AttachThreadInput(current, target, True)
        GetCaretPos(p)
        Dim fWnd = GetFocus()
        ClientToScreen(fWnd, p)
        AttachThreadInput(current, target, False)
        Me.SetDesktopLocation(p.X, p.Y)
    End Sub
    
    Declare Auto Function GetCaretPos Lib "user32.dll" (ByRef lpPoint As Point) As Boolean
    Declare Auto Function GetForegroundWindow Lib "user32.dll" () As IntPtr
    Declare Auto Function AttachThreadInput Lib "user32.dll" (idAttach As IntPtr, idAttachTo As IntPtr, fAttach As Boolean) As IntPtr
    Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (hWnd As IntPtr, lpdwProcessId As IntPtr) As IntPtr
    Declare Auto Function GetCurrentThreadId Lib "kernel32" () As IntPtr
    Declare Auto Function GetFocus Lib "user32.dll" () As IntPtr
    Declare Auto Function ClientToScreen Lib "user32.dll" (hwnd As IntPtr, ByRef lpPoint As Point) As Boolean
    

    2015年4月16日 12:36
    モデレータ

すべての返信

  • こんにちは。

    以下を参考にAPIで取得しては。
    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=res&mo=32472&namber=32471&space=15&page=0&no=0/

    帰ったら試してみます。

    追記>
    リンク先を参考にVB.NETへ移植しました。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.TopMost = True
        Timer1.Interval = 3000
        Timer1.Start()
    End Sub
    
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        SetCurrentInput()
    End Sub
    
    Private Sub SetCurrentInput()
        Dim hWnd = GetForegroundWindow()
        Dim current = GetCurrentThreadId()
        Dim target = GetWindowThreadProcessId(hWnd, IntPtr.Zero)
        Dim p As Point
        AttachThreadInput(current, target, True)
        GetCaretPos(p)
        Dim fWnd = GetFocus()
        ClientToScreen(fWnd, p)
        AttachThreadInput(current, target, False)
        Me.SetDesktopLocation(p.X, p.Y)
    End Sub
    
    Declare Auto Function GetCaretPos Lib "user32.dll" (ByRef lpPoint As Point) As Boolean
    Declare Auto Function GetForegroundWindow Lib "user32.dll" () As IntPtr
    Declare Auto Function AttachThreadInput Lib "user32.dll" (idAttach As IntPtr, idAttachTo As IntPtr, fAttach As Boolean) As IntPtr
    Declare Auto Function GetWindowThreadProcessId Lib "user32.dll" (hWnd As IntPtr, lpdwProcessId As IntPtr) As IntPtr
    Declare Auto Function GetCurrentThreadId Lib "kernel32" () As IntPtr
    Declare Auto Function GetFocus Lib "user32.dll" () As IntPtr
    Declare Auto Function ClientToScreen Lib "user32.dll" (hwnd As IntPtr, ByRef lpPoint As Point) As Boolean
    

    2015年4月16日 12:36
    モデレータ
  • お世話になります。詳しくご記入いただきありがとうございます。

    ソースを反映して、ご報告いたします。

    2015年4月20日 7:59
  • 大変遅くなってすみません。希望通りの動きが実現できました。

    ありがとうございました。

    2015年6月10日 4:41