Работа с другим приложением без Hook и DLL на примере GetFocus
Своим опытом делится SottNick: На стандартной форме (Form1):
Form1.FormStyle=fsStayOnTop - форма поверх остальных окон
Объекты:
ТАЙМЕР (Timer1) с периодом 1000 или меньше, 3 метки (Label1, Label2, Label3). назначение их см. в тексте процедуры У таймера событие OnTimer. а вот для нее обработчик:
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 объекта можно использовать по своему разумению. Например, считать из объекта текст и т.п.}