Option Explicit

' 指定時間Wait(ミリ秒)
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' ウィンドウにメッセージを送る関数の宣言
Public Declare Function SendMessage Lib "user32.dll" _
    Alias "SendMessageA" _
   (ByVal hWnd As Long, _
    ByVal Msg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long

' ウィンドウにメッセージを送る関数の宣言
Public Declare Function SendMessageAny Lib "user32.dll" _
    Alias "SendMessageA" _
   (ByVal hWnd As Long, _
    ByVal Msg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As String) As Long
    
Public Const WM_IME_CHAR = &H286    '文字コード送信
Public Const WM_SETTEXT = &HC       '文字列送信


' アクティブなウィンドウハンドルを取得
Private Declare Function GetForegroundWindow Lib "user32" () As Long

' スレッドIDとプロセスIDを取得
Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
        ByVal hWnd As Long, lpdwProcessId As Long) As Long

' この関数を呼び出したスレッドが持つ全てのウィンドウの内、
' キーボードフォーカスを持つウィンドウのハンドルを取得する
Private Declare Function GetFocus Lib "user32" () As Long

' 特定のスレッドの入力処理機構を別のスレッドにアタッチする
Private Declare Function AttachThreadInput Lib "user32" ( _
        ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long


Public Function GetFocusWindow() As Long
'
' キーボードフォーカス(キー入力を受け付け可能な状態)を持つウィンドウハンドルを返す
'
    Dim ThreadId As Long    'スレッドID
    Dim lngRc As Long       '関数からの返却値
    
    ThreadId = GetWindowThreadProcessId(GetForegroundWindow, vbNull)
    If ThreadId = App.ThreadId Then '自分自身であれば
        GetFocusWindow = GetFocus   'その中でキーボーフォーカスを持つウィンドウハンドル
    Else
        '自分自身がアクティブでなければ、アクティブなスレッドにアタッチする
        lngRc = AttachThreadInput(App.ThreadId, ThreadId, True)
        GetFocusWindow = GetFocus   'その中でキーボーフォーカスを持つウィンドウハンドル
        lngRc = AttachThreadInput(App.ThreadId, ThreadId, False)    'デタッチする
    End If

End Function