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