Если вы хотите знать элемент управления внутри формы с определенной координатой x, y
Используйте
function TWinControl.ControlAtPos(const Pos: TPoint; AllowDisabled: Boolean;
AllowWinControls: Boolean = False; AllLevels: Boolean = False): TControl;
Учитывая тот факт, что вам кажется интересным только формы внутри приложения, вы можете просто запросить все формы.
Как только вы получите результат, отличный от nil, вы можете запросить элемент управления для его дескриптора с кодом, подобным следующему
Псевдокод
function HandleOfControlAtCursor: THandle;
const
AllowDisabled = true;
AllowWinControls = true;
AllLevels = true;
var
CursorPos: TPoint
FormPos: TPoint;
TestForm: TForm;
ControlAtCursor: TControl;
begin
Result:= THandle(0);
GetCursorPos(CursorPos);
for each form in my application do begin
TestForm:= Form_to_test;
FormPos:= TestForm.ScreenToClient(CursorPos);
ControlAtCursor:= TestForm.ControlAtPos(FormPos, AllowDisabled,
AllowWinControls, AllLevels);
if Assigned(ControlAtCursor) then break;
end; {for each}
//Break re-enters here
if Assigned(ControlAtCursor) then begin
while not(ControlAtCursor is TWinControl) do
ControlAtCursor:= ControlAtCursor.Parent;
Result:= ControlAtCursor.Handle;
end; {if}
end;
Это также позволяет исключить некоторые формы из рассмотрения, если вы того пожелаете. Если вы ищете простоту, я бы пошел с Дэвидом и использовал FindVCLWindow
.
P.S. Лично я бы использовал goto
вместо перерыва, потому что при переходе сразу становится ясно, где перерыв повторяется, но в этом случае это не большая проблема, потому что между перерывом и повторением нет никаких утверждений. точка входа.