El problema aquí es que para poder poner el foco en el control deseado necesitas poder identificar dicho control.
La única manera que se me ocurre es similar a mandar tabs o flechitas pero con la diferencia de que no lo nota el usuario.
Comienzas identificando la ventana del programa con FindWindow. Para ello necesitarás saber el título de la ventana y/o el nombre de clase. Me parece más conveniente lo último para evitar confusiones con otra posibles ventanas que tengan el mismo título.
La manera má rápida de saber el nombre de la clase es usando el programa WinSight que viene incluído con Delphi.
Una vez que tengas el "handle" de la ventana usas FindWindowEx para encontrar el control deseado. Deberás aplicar tantos FindWindowEx (ejemplo abajo) como controles haya antes del deseado.
Esta es la parte similar a la de mandar Tabs pero el usuario no se percata de ello.
Finalmente, una vez que tengas el "handle" del control deseado le mandas el mensaje WM_NETXDLGCTL a la ventana padre para poner el foco.
Vamos a suponer que la aplicación tiene por nombre de clase: "ClaseApp" y que estás buscando un control de edición. Normalmente la clase de estos controles es "EDIT". Supongamos que es el cuarto control. El código sería como sigue:
Código:
var
Parent: HWnd;
Child: HWnd;
begin
Parent := FindWindow('ClaseApp', nil);
if Parent <> 0 then
begin
Child := FindWindowEx(Parent, 0, 'EDIT', nil);
Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
Child := FindWindowEx(Parent, chldHandle, 'EDIT', nil);
SendMessage(Parent, WM_NEXTDLGCTL, chldHandle, 1);
end;
end;
Por supuesto la cuestión se complica un poco si el control deseado no es hijo directo de la ventana padre (por ejemplo si está dentro de un panel). En tal caso deberás usar un extra FindWindowEx para encontrar el control intermedio y usar ese como padre.
Nota En la prueba que hice los controles los va hallando en orden inverso al orden de tabulación, pero bastará seguir dicho orden.
// Saludos