Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Функция AttachThreadInput связывает механизм обработки пользовательского ввода одного потока с таким-же механизмом другого потока. Windows создает в разных потоках обычный независимый от других потоков поток ввода. Это означает, что каждый поток ввода имеет свое собственное состояние (фокус, активность, обрабатываемые окна, состояние клавиатуры, состояние очереди и т.п.) и он не синхронизирован с процессом ввода другого потока. Используя функцию AttachThreadInput, поток может связать свою обработку пользовательского ввода с другим потоком. Становится также возможным разделять состояния потока ввода, и поток может, вызвав функцию SetFocus, установить фокус ввода с клавиатуры на окно другого потока. Кроме того, потоки могут получать информацию о состоянии клавиатуры. Такие возможности обычно недоступны. Функция AttachThreadInput завершается с ошибкой если потоки не имеют очереди сообщений. Система создает очередь сообщений потока при первом вызове одной из функций группы USER или GDI Win32 API. Функция AttachThreadInput также завершается с ошибкой, если установлено протоколирование (journal record hook). Протоколирование соединяет все очереди ввода вместе. Обратите внимание, что состояние клавиатуры сбрасывается после вызова AttachThreadInput.
В случае ошибки функция возвращает 0. В успешном случае возвращается ненулевое значение.
' Сначала запустите калькулятор Dim ThreadID1 As Long Dim ThreadID2 As Long Dim hWnd As Long ' описатель окна hWnd = FindWindow(vbNullString, "Калькулятор") ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&) ThreadID2 = GetWindowThreadProcessId(hWnd, ByVal 0&) Call AttachThreadInput(ThreadID1, ThreadID2, True) Call SetFocusAPI(hWnd)