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; |