Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-01-2007
carlos_nielsen carlos_nielsen is offline
Registrado
 
Registrado: ene 2007
Posts: 6
Poder: 0
carlos_nielsen Va por buen camino
Handle disabled

Quisiera saber como obtener el handle de un control de un form (como por ejemplo un tedit)
que esta deshabilitado (enabled:=false). Estoy probando con hooks de sistema y logro obtener
los handles de los controles al pasar el mouse por encima pero si el control esta deshabilitado
obtengo el handle del form.
Si alguien puede orientarme un poco por donde buscar o pasarme algun codigo de ejemplo le voy a agradecer.
Responder Con Cita
  #2  
Antiguo 13-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Que hooks utilizas? ¿Puedes poner algo de código?
Responder Con Cita
  #3  
Antiguo 13-01-2007
carlos_nielsen carlos_nielsen is offline
Registrado
 
Registrado: ene 2007
Posts: 6
Poder: 0
carlos_nielsen Va por buen camino
Utilizo una hook de mouse para obtener los handles de los objetos alm pasar el puntero del mouse por encima. paso codigo de libreria y programa.
Código Delphi [-]
 
 library hookmouse;
 uses
  Windows,
  Messages;
const
  CM_MANDA_DATOS = WM_USER + $1000;
 type
  TCompartido = record
    Receptor,
    wHitTestCode,
    x,y,
    Ventana         : hwnd;
  end;
  PCompartido   =^TCompartido;

 var
  HookDeMouse  : HHook;
  FicheroM     : THandle;
  Compartido   : PCompartido;

 function CallBackDelHook( Code    : Integer;
                           wParam  : WPARAM;
                           lParam  : LPARAM
                           )       : LRESULT; stdcall;
 var
   DatosMouse     : PMouseHookStruct;
   Intentos       : integer;
 begin
  if code=HC_ACTION then
  begin
   FicheroM:=OpenFileMapping(FILE_MAP_WRITE,False,'ElReceptor');
   if FicheroM<>0 then
   begin
     Compartido:=MapViewOfFile(FicheroM,FILE_MAP_WRITE,0,0,0);
     DatosMouse:=Pointer(lparam);
     Compartido^.Ventana:=DatosMouse^.hwnd;
     Compartido^.x:=DatosMouse^.pt.x;
     Compartido^.y:=DatosMouse^.pt.y;
     PostMessage(Compartido^.Receptor,CM_MANDA_DATOS,wParam,lParam);
     UnmapViewOfFile(Compartido);
     CloseHandle(FicheroM);
   end;
  end;
  Result := CallNextHookEx(HookDeMouse, Code, wParam, lParam)
 end;
 procedure HookOn; stdcall;
 begin
   HookDeMouse:=SetWindowsHookEx(WH_MOUSE, @CallBackDelHook, HInstance , 0);
 end;
 procedure HookOff;  stdcall;
 begin
   UnhookWindowsHookEx(HookDeMouse);
 end;
 exports
  HookOn,
  HookOff;
 begin
 end.
 
 
en el programa...........
 
procedure TForm1.LlegaDelHook(var message: TMessage);
var
  DatosMouse     : PMouseHookStruct;
  NombreVentana  : array [0..200] of char;
  Accion         : string;
begin 
  with Compartido^ do 
  begin
    Label1.caption:='['+IntToStr(x)+':'+IntToStr(y)+']';
  end;
  GetWindowText(Compartido^.Ventana,@NombreVentana,200);
  Label2.Caption:=NombreVentana;
  label3.Caption:=inttostr(Compartido^.Ventana);
//aqui en label3 es donde se van mostrando los handles de los controles por los que pasa el puntero del mouse.
Lo que me interesa es obtener el handle pero de un control que esta deshabilitado.

Última edición por marcoszorrilla fecha: 13-01-2007 a las 16:29:25.
Responder Con Cita
  #4  
Antiguo 13-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Un problema curioso. Y le veo difícil solución, cuando un control (ventana) esta deshabilitado no recibe los mensajes del ratón. También pensé en utilizar la función WindowFromPoint, pero parece que no funciona con las ventanas deshabilitadas.

Se me ocurre que para lo que tu quieres hacer, puede haber otras soluciones que no pasen precisamente por utilizar hooks, quizás enumerando las ventanas podríamos conseguir el handle. ¿Es necesario usar el ratón para seleccionar la ventana? o podemos emplear otros métodos.
Responder Con Cita
  #5  
Antiguo 13-01-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
También pensé en utilizar la función WindowFromPoint, pero parece que no funciona con las ventanas deshabilitadas.
Aunque el SDK indica que puede usarse ChildWindowFromPoint para esos casos. Claro que si la ventana deshabilitada es la ventana padre pues...

// Saludos
Responder Con Cita
  #6  
Antiguo 13-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
Aunque el SDK indica que puede usarse ChildWindowFromPoint para esos casos. Claro que si la ventana deshabilitada es la ventana padre pues...
Siempre con la última palabra

Es verdad, ChildWindowFromPoint puede obtener el handle de una ventana deshabilitada, pero primero necesitamos tener el handle de su padre, o en su caso abuelos Pero eso lo podemos solucionar fácilmente con un bonito bucle. La cosa quedaría así:

Código Delphi [-]
const
  // Utilizamos un hook de bajo nivel, asi no me lio con dlls
  WH_MOUSE_LL = 14;

type
  ULONG_PTR = ULONG;
  // Esta estructira es necesaria para el Hook
  TMSLLHOOKSTRUCT = record
    pt: TPoint;
    mouseData: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: ULONG_PTR;
  end;
  PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;

var
  MouseHook: HHook;

// Esta funcion nos devuelve el handle de la ventana mas joven.
function HandleFromPoint(P: TPoint): THandle;
var
  hWnd: THandle;
  ClientP: TPoint;
begin
  hWnd:= WindowFromPoint(P);
  repeat
    Result:= hWnd;
    ClientP:= P;
    if Windows.ScreenToClient(hWnd,ClientP) then
      hwnd:= ChildWindowFromPoint(hWnd,ClientP);
  until (hWnd = 0) or (Result = hWnd);
end;

function MouseProc(Code: Integer; WParam, LParam: DWORD): LRESULT; stdcall;
begin
  if (Code = HC_ACTION) and (WParam = WM_MOUSEMOVE) then
  begin
    frmMain.Caption:= IntToStr(HandleFromPoint(PMSLLHOOKSTRUCT(lParam).pt));
  end;
  Result := CallNextHookEx(MouseHook, Code, WParam, LParam);
end;

Te dejo todo esto envuelto para regalo , en este zip:
Archivos Adjuntos
Tipo de Archivo: zip Ejemplo36.zip (5,2 KB, 33 visitas)
Responder Con Cita
  #7  
Antiguo 13-01-2007
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Pues acabo de hacer una prueba con el ejemplo que envías y sí que queda bonito el bucle mentado.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #8  
Antiguo 14-01-2007
carlos_nielsen carlos_nielsen is offline
Registrado
 
Registrado: ene 2007
Posts: 6
Poder: 0
carlos_nielsen Va por buen camino
Antes de continuar con el tema específico hago una pausa para comentarte que es la primera vez que escribo en un foro, y la verdad es que me veo gratamente sorprendido por la solidaridad demostrada respondiendo a las preguntas y tan rapido! asique renuevo mi agradecimiento.
Te comento que el codigo que me mandaste se compila perfecto pero no me da ningun resultado.(lo unico que quite es la declaracion de variants de las units porque no la tengo, pero no creo que influya, si compilo bien es porque no la necesitaba supongo).
Por otro lado me ayudaste un monton porque resolvi el problema con la funcion ChildWindowFromPoint desde mi programa. Aunque me surgio un nuevo problema. No puedo cambiar el texto de un label de otra aplicacion puesto que esta es un control estatico y no tienen handle. Que me sugeris para resolver el tema.
Responder Con Cita
  #9  
Antiguo 14-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Probaste el ejemplo que viene en el zip? ¿No te aparece en el caption del form el handle de las ventanas al mover el ratón? Pues no lo entiendo ...

Por otra parte preguntas como cambiar el texto de un control de otra aplicación. ¿Como lo estas intentando ahora?
Responder Con Cita
  #10  
Antiguo 15-01-2007
carlos_nielsen carlos_nielsen is offline
Registrado
 
Registrado: ene 2007
Posts: 6
Poder: 0
carlos_nielsen Va por buen camino
Cita:
Empezado por seoane
¿Probaste el ejemplo que viene en el zip? ¿No te aparece en el caption del form el handle de las ventanas al mover el ratón? Pues no lo entiendo ...

Por otra parte preguntas como cambiar el texto de un control de otra aplicación. ¿Como lo estas intentando ahora?
Si. probe y no funciona. Cuando tenga mas tiempo lo voy a tratar de analizar a ver porque falla. si obtengo alguna novedad te aviso.
El texto lo cambio como te dije en los anteriores mensaje. Obtengo el handle de cualquier objeto visible al pasar el mouse por encima. Luego cambio el texto del objeto(edit,button,form,etc) pasandole el handle. En unas horas vuelvo al cyber y te paso el codigo completo de la dll y el programa. tengo que hacer un tramite primero y emprolijar primero el codigo porque a esta altura de agregados ya casi ni yo lo entiendo.
si tenes idea de como trabajar con labels pasame alguna idea porque estoy desorientado. no se por donde buscar ya que no se como se identifican. seria interesante tambien si sabes alguna manera de espiar todos los mensajes que procesa una aplicacion desde que se crea (una aplicacion externa a la mia)
Responder Con Cita
  #11  
Antiguo 15-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Carlos ¿Usas windows 98? porque el hook de bajo nivel solo funciona en 2000/XP. Es la única explicación que se me ocurre ...

Bueno, dejando ese tema aparte, vamos con tu segunda pregunta.
Cita:
Empezado por carlos_nielsen
El texto lo cambio como te dije en los anteriores mensaje
No soy capaz de encontrar donde muestras como cambias el texto de otra ventana, pero lo que si veo es como lo lees.
Cita:
Empezado por carlos_nielsen
GetWindowText(Compartido^.Ventana,@NombreVentana,200);
Como habrás notado tanto esta función, como SetWindowText, no funcionan en ventanas hijas de otras aplicaciones. Por eso te preguntaba como lo hacías, porque así ya podíamos saber si ese era el error.

Cita:
Empezado por carlos_nielsen
En unas horas vuelvo al cyber y te paso el codigo completo de la dll y el programa
Vale, dejemoslo hasta entonces ...
Responder Con Cita
  #12  
Antiguo 15-01-2007
carlos_nielsen carlos_nielsen is offline
Registrado
 
Registrado: ene 2007
Posts: 6
Poder: 0
carlos_nielsen Va por buen camino
La funcion que utilizo es sendmessage para enviarle el mesaje que quiero que procese la aplicacion destino.
el formato es el siguiente:
sendmessage(handle,wm_settext,0,longint(pchar('texto')))
el mismo efecto se consigue con postmessage la diferencia es que post pone el mensaje en la cola de mensajes de la aplicacion destino y retorna. send espera a que le devuelva un valor.
el error de la apliacion que me mandaste es como dijiste. lo ejecute en un ordenador con w98.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda sobre Handle Pascalizado Varios 2 06-11-2006 05:21:54
ayuda comparar Handle JerS API de Windows 3 30-10-2006 20:19:01
Cambiar la apariencia del DISABLED??? arieliten Varios 4 18-03-2005 15:40:34
Cannot focus a disabled or invisible window TONIAM Varios 3 02-03-2005 17:29:04
Obtener Handle de un objeto senpiterno Varios 6 22-04-2004 15:21:40


La franja horaria es GMT +2. Ahora son las 12:24:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi