Ver Mensaje Individual
  #3  
Antiguo 11-12-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
    { Public declarations }
  end;

var
  frBusca: TfrBusca;

implementation {$R *.dfm} {$WARNINGS OFF}

type
  TClassNfo = class(TObject)
    Name: string;
    Handle: HWND;
  end;

(* Agregar nombre de clases al ComboBox *)
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;

(* Buscar controles en la aplicacion *)
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;

(* Texto del control de la aplicación al RichEdit *)
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;

(* Texto del RichEdit a control de la aplicación *)
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   // <= Aqui
    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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita