Функция AttachThreadInput

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. В успешном случае возвращается ненулевое значение.

Параметры

idAttach
Определяет идентификатор потока, связываемого с другим потоком. Присоединяемый поток не может быть системным
idAttachTo
Определяет идентификатор потока, с которым производится связывание. Этот поток не может быть системным. Нельзя связать поток с самим собой. Иными словами, значение параметра idAttachTo не может совпадать с idAttach
fAttach
Определяет связываются потоки, или отсоединяется. Если значение данного параметра TRUE, потоки связываются. Если значение параметра FALSE, потоки отсоединяются

Пример

' Сначала запустите калькулятор
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)

Смотри также

GetCurrentThreadId

Категория

Процессы и потоки

Реклама