PDA

Ver la Versión Completa : SysListView32 de TaskMgr de Windows


aeff
23-10-2007, 19:38:53
Saludos, miren este problema, estoy tratando de eliminar uno de los Ítems del ListView que muestra los procesos en el Administrador de Tareas, no solamente eliminar sino también obtener el titulo de este, estas operaciones las realizo con las funciones para manejar el control ListView de la unit commctrl, ejemplo de ellas:


ListView_GetItemCount
ListView_GetItem
ListView_DeleteItem
ListView_GetItemText




Bueno, lo primero que hago es obtener el Handle de este control, he tratado de hacerlo de la siguiente forma pero no funciona:


var
LV_Handle: Cardinal;
begin
LV_Handle := FindWindow(nil, 'Administrador de tareas de Windows');
LV_Handle := FindWindowEx(LV_Handle, 0, 'SysListView32', 'Procesos');


No se por que pero no me resuelve el Handle del Listview de procesos del Administrador de tareas,

Para eso he usado la siguiente función:


function GetTaskMgrListViewProcess(): Cardinal;
const
LV_ClassName = 'SysListView32';
LV_WindowName = 'Procesos';
TMgr_Title = 'Administrador de tareas de Windows';
var
vTaskMgrWnd: Cardinal;

function EnumObjectsFunc(Hwnd, lParam: LongInt): Boolean; stdcall;
var
wndText: array[0..100] of char;
wndClass: array[0..100] of char;
begin
Result := true;
GetWindowText(Hwnd, wndText, 100);
GetClassName(Hwnd, wndClass, 100);
if (wndText = LV_WindowName) and (wndClass = LV_ClassName) then
vLVHwnd := Hwnd;
end;

begin
Result := 0;
vTaskMgrWnd := FindWindow(nil, TMgr_Title);
if vTaskMgrWnd > 0 then
begin
EnumChildWindows(vTaskMgrWnd, @EnumObjectsFunc, 0);
Result := vLVHwnd;
end;
end;


Con esta función si obtengo el Handle de este Listview , ahora lo que quiero es obtener el titulo/text/caption del item #1 por ejemplo, lo intento de esta forma:


Uses commctrl;

Var
vLVHwnd: Cardinal;


procedure TForm1.Button1Click(Sender: TObject);
var
LV_Handle: Cardinal;
ItemText: array[0..100] of Char;
begin
LV_Handle := GetTaskMgrListViewProcess();
ListView_GetItemText(LV_Handle, 1, 1, ItemText, 100);

end;



Y ocurre un error en el Administrador de tareas, se cierra y al final no obtengo el titulo de item #1,

¿alguien me puede ayudar con este problema?, ¿Cómo obtengo el texto de un item cualquiera de este Listview?


Muchas gracias de antemano
Saludos cordiales,

aeff

seoane
23-10-2007, 23:55:26
Hola aeff, quizá te resulte interesante este pequeño entretenimiento:
http://www.clubdelphi.com/foros/showthread.php?t=37902

Por otro lado, tu problema puede ser debido a que la dirección de memoria que pide la función ListView_GetItemText tiene que pertenecer al proceso dueño del ListView, y tu lo estas llamando desde otro proceso diferente. Tendría que comprobarlo, pero creo que el problema puede venir por ahí.

;) Prueba con la inyección

aeff
24-10-2007, 02:42:12
muy bueno esto de la inyección, pero en palabras, me puedes explicar paso a paso en que consiste???

saludos!

aeff
24-10-2007, 02:47:12
ahh! otra cosa *seoane*, aquellos códigos que implementaste, ¿es para que en cualquier control que en el Sistema pertenezca a la clase SysListView32 el item que diga *Injector.exe* sea renombrado por "" o Nil? no?? A TODOS LOS LISTVIEW QUE SEAN CREADOS MIENTRAS EL PROGRAM SE EJECUTA NO?!!!?!

Caral
24-10-2007, 02:49:05
Hola
muy bueno esto de la inyección, pero en palabras, me puedes explicar paso a paso en que consiste???

saludos!
Y crees que el Maestro seoane es de este mundo?.
Esto hay que verlo, no creo que se pueda explicar en palabras el código del maestro, esta mas allá del entendimiento humano.:D
Me gustaría hablar su idioma.:)
Saludos