Ver Mensaje Individual
  #6  
Antiguo 11-12-2012
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Reputación: 20
cesarsoftware Va por buen camino
Hola ecfisa.
Muy bien para localizar los controles, estaria bien obtener sus nombres ademas del THandle.

Pero...no me va el leer texto con TfrBusca.btnAppToREClick(Sender: TObject);
Código Delphi [-]
    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);

R siempre devuelve 0 (cero) y se queda en el repeat; tambien pasa en la funcion TfrBusca.btnREToAppClick(Sender: TObject);

Lo he hecho de otra forma (mas simple) y me mete en un listbox, la aplicacion(proceso), sus formularios y sus respectivos controles
Añadir un listbox y un richedit
Código Delphi [-]
// Obtener todos los formularios y sus controles de un proceso
procedure ListWinInfoFromPId(PId: longword; strings: TStrings);
type
  TWinParam = record
    PId: longword;
    S: TStrings;
  end;
  PWinParam = ^TWinParam;
var
  WinParam: TWinParam;

  // Obtener los controles
  function CallbackFn(handle: Thandle; strings: TStrings): longbool; stdcall;
  var
    buffer: array[0..255] of char;
  begin
    Result := True;
    if GetClassName(handle, buffer, 256) <> 0 then
      // if buffer = 'TComboBox' then
      strings.Add(IntToStr(handle) + ' ' + buffer);
  end;

  // Obtener los formularios
  function EnumWindowsProc(handle: Thandle; lPar: LPARAM): boolean; stdcall;
  var
    PId: longword;
    buffer: array [0..255] of char;
  begin
    Result := True;
    PId := 0;
    // Comprobamos que sean de esa PId, sino se obtiene la lista desordenada
    GetWindowThreadProcessId(handle, PId);
    if PWinParam(lPar).PId = PId then
    begin
      PWinParam(lPar).S.Add('hWnd: ' + IntToHex(handle, 8) + 'h');
      GetWindowText(handle, @buffer, 255);
      PWinParam(lPar).S.Add('Caption: ' + buffer);
      GetClassName(handle, @buffer, 255);
      PWinParam(lPar).S.Add('Clase: ' + buffer);
      // Obtenemos todos los controles del formulario ¡Solo si los ha mostrado!
      EnumChildWindows(handle, @CallbackFn, LPARAM(PWinParam(lPar).S));
      PWinParam(lPar).S.Add(StringOfChar('-', 40));
    end;
  end;

begin
  WinParam.PId := PId;
  WinParam.S := strings;
  // Obtener todos los formularios de un proceso
  EnumWindows(@EnumWindowsProc, LPARAM(@WinParam));
end;

// Obtener todos los procesos activos
function EnumWinProc(handle: Thandle; param: pointer): boolean; stdcall; export;
var
  nombre: array[0..255] of char;
  PId: longword;
begin
  Result := True;
  // Obtenemos el nombre del proceso
  GetWindowText(handle, nombre, 255);
  if (nombre <> '')
  and (IsWindowVisible(handle))
  and (GetWindow(handle, gw_Owner) = 0)
  then
  begin
    GetWindowThreadProcessId(handle, PId);
    FormMain.ListBox1.Items.Add(IntToStr(PId) + ' ' + nombre);
    FormMain.ListBox1.Items.Add(StringOfChar('-', 80));
    // Obtenemos los formularios y los campos del proceso
    ListWinInfoFromPId(PId, FormMain.ListBox1.Items);
  end;
end;

y apara usarlo

Código Delphi [-]
procedure TFormMain.Create(Sender: TObject);
  // Obtener todos los controles de todos los formularios de todos los procesos
  EnumWindows(@EnumWinProc, LongInt(Self));
end;

procedure TFormMain.ListBox1Click(Sender: TObject);
var
  buffer: array[0..8192] of Char;
  p: integer;
  handle: HWND;
  s: string;
begin
  s := ListBox1.Items[ListBox1.ItemIndex];
  p := Pos(' ' , s);
  s := Copy(s, 1, p - 1);
  handle := StrToIntDef(s, 0);
  if handle = 0 then
    Exit;
  // r := GetClassName(handle, Buffer, SizeOf(Buffer)); // siempre devuelve 0
  SendMessage(handle, WM_GETTEXT, SizeOf(Buffer), Integer(@Buffer));
  RichEdit1.Text := Buffer; // buffer nunca tiene el texto de ningun control
end;

Teniendo el handle del control ¿Como podemos obtener su clase, Tedit, Tcombox, etc, si no me funciona GetClassName? Uso Delphi 2010 y windows 7 64.

¿Se te ocurre algo?

Gracias

Edito: Lo mejor seria obtener el objeto ¿Se puede? asi seria mas facil, se podria usar richedit1.text := Trichedit(TObject).Text

Última edición por cesarsoftware fecha: 11-12-2012 a las 12:27:51.
Responder Con Cita