Hola sesarsoftware.
Otra opción, agrega un Edit, un ComboBox, tres Buttons dentro de un Panel, debajo un RichEdit y proba este ejemplo:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, XPMan, ExtCtrls;
type
TfrBusca = class(TForm)
RichEdit1: TRichEdit;
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
btnSearchApp: TButton;
Label2: TLabel;
ComboBox1: TComboBox;
btnAppToRE: TButton;
btnREToApp: TButton;
procedure btnSearchAppClick(Sender: TObject);
procedure btnAppToREClick(Sender: TObject);
procedure btnREToAppClick(Sender: TObject);
private
public
end;
var
frBusca: TfrBusca;
implementation {$R *.dfm} {$WARNINGS OFF}
type
TClassNfo = class(TObject)
Name: string;
Handle: HWND;
end;
function CallbackFn(aHandle: HWND; LB: TListBox): LongBool; stdcall;
var
Buffer: array[0..255] of Char;
CN: TClassNfo;
begin
Result := True;
if GetClassName(aHandle, Buffer, 256) <> 0 then
begin
CN := TClassNfo.Create;
CN.Name := Buffer;
CN.Handle := aHandle;
LB.AddItem(CN.Name, TClassNfo(CN));
end;
end;
procedure TfrBusca.btnSearchAppClick(Sender: TObject);
var
H: HWND;
begin
ComboBox1.Clear;
H := FindWindow(nil, PChar(Edit1.Text));
if H <> 0 then
EnumChildWindows(H, @CallbackFn, LPARAM(ComboBox1));
end;
procedure TfrBusca.btnAppToREClick(Sender: TObject);
var
Buffer: array[0..8192] of Char;
R : Integer;
begin
with ComboBox1 do
begin
repeat
R:= GetClassName(TClassNfo(Items.Objects[ItemIndex]).Handle,
Buffer, SizeOf(Buffer));
SendMessage(TClassNfo(Items.Objects[ItemIndex]).Handle,
WM_GETTEXT, SizeOf(Buffer), Integer(@Buffer));
RichEdit1.Text:= Buffer;
until (Buffer = Items[ItemIndex])or(R <> 0);
end;
if R > 0 then
RichEdit1.Text:= Buffer;
end;
procedure TfrBusca.btnREToAppClick(Sender: TObject);
var
Buffer: array[0..8192] of Char;
R : Integer;
begin
with ComboBox1 do
begin
repeat
R:= GetClassName(TClassNfo(Items.Objects[ItemIndex]).Handle,
Buffer, SizeOf(Buffer));
if Buffer = Items[ItemIndex] then
begin
StrPCopy(Buffer,RichEdit1.Text);
SendMessage(TClassNfo(Items.Objects[ItemIndex]).Handle,
WM_SETTEXT, SizeOf(Buffer), Integer(@Buffer));
end;
until (Buffer = Items[ItemIndex])or(R <> 0);
end;
end;
end.
Si no sabes que clases puede contener la aplicación, quizá te interese comprobar en la función
CallbackFn si el control es un
Edit Control
Código Delphi
[-]
...
if GetClassName(aHandle, Buffer, 256) <> 0 then
begin
if Buffer = 'Edit' then begin
CN := TClassNfo.Create;
CN.Name := Buffer;
CN.Handle := aHandle;
LB.AddItem(CN.Name, TClassNfo(CN))
end
...
Logicamente es fundamental escribir en el edit
textualmente el título de la ventana cuyo handle queremos obtener. También habrá controles de los cuales no podamos recibir o enviar texto alguno.
Saludos.
