procedure
TForm1.Timer1Timer(Sender: TObject);
var
dwTargetOwner :DWORD;//указатель на
подключаемый процесс
dwThreadID :DWORD;//указатель на текущий
процесс
Result:longbool;
begin
{В первой метке отображается Handle активного
окна}
Label1.Caption:=IntToStr(GetForegroundWindow);//указатель на подключаемое приложение
// Подключение потока другого окна
dwTargetOwner :=
GetWindowThreadProcessId(GetForegroundWindow,nil);//указатель на подключаемый процесс
dwThreadID := GetCurrentThreadId();//указатель
на текущий процесс
if (dwTargetOwner <>dwThreadID) then // если не один и тот же процесс
Result := AttachThreadInput(dwThreadID, dwTargetOwner, TRUE);//подключение
{Во второй метке отображается Handle объекта 'в фокусе' в активном
окне}
Label2.Caption:=IntToStr(GetFocus);//фокус в
другом приложении
if (Result) then
AttachThreadInput(dwThreadID, dwTargetOwner, FALSE);//отключение
{В третей метке отображается Handle объекта 'в фокусе' в активном
окне,
но если это окно другого приложения, то Handle будет равен
нулю,
т.к. попытка получения Handle происходит после отключения
потока}
Label3.Caption:=inttostr(GetFocus);//проверка
после отключения
{Эффект можно посмотреть, если запустить полученное
приложение
и сделать активным другое приложение}
{Ясно, что полученный Handle объекта можно использовать
по своему разумению. Например, считать из объекта текст и
т.п.}
// (C) SottNick 2000
end;