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