Red de conocimiento informático - Material del sitio web - Cómo evitar mediante programación que los archivos ejecutables se cierren en el Administrador de tareas (c++)

Cómo evitar mediante programación que los archivos ejecutables se cierren en el Administrador de tareas (c++)

Se puede hacer de acuerdo con las siguientes ideas.

1. Escriba una función. La función de esta función es encontrar el proceso del programa en el administrador de tareas abierto y prohibir cerrar el proceso especificado.

2. Abra un temporizador (Timer) y llame a la función anterior a intervalos regulares.

El siguiente es el código de la función función.

/1, el siguiente es el código VC++ de la función

void CTestDlg:: KillWindowsManager()

{

HWND hwnd ;

int iItem=0;

LVITEM lvitem, * plvitem;

char ItemBuf[512],*pItem;

DWORD PID;

HANDLE hProcess;

// Buscar el identificador de la ventana ListView del Administrador de tareas

hwnd=::FindWindow( "#32770",_T("Tarea de Windows Manager" ));

hwnd=::FindWindowEx(hwnd,0, "#32770",0);

hwnd=::FindWindowEx(hwnd,0, "SysListView32" ,0 );

// Encuentra el identificador de la ventana de vista de lista del Administrador de tareas

// Encuentra el identificador de la ventana de vista de lista del Administrador de tareas. p>

// Si el Administrador de tareas de Windows no se ha iniciado, regrese

if (!hwnd)

Return

else;

{

// Si no se especifica ningún proceso de destino, devuelve

iItem=::SendMessage(hwnd,LVM _GETNEXTITEM,-1,LVNI_SELECTED);

If (iItem==-1)

Devolución;

else

{

// No se pudo obtener el identificador del proceso Return

GetWindowThreadProcessId(hwnd, &PID);

hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);

if (!

Devolver;

En caso contrario

{

plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

// Devuelve si no se puede asignar memoria

if ( (! plvitem)||(!pItem))

Retorno

else

{

lvitem.cchTextMax=512;

lvitem.iSubItem=0; //Nombre del proceso

lvitem.pszText=pItem;

lvitem.iSubItem=0; //Nombre del proceso

Volver.

pszText=pItem;

WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);

::SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)iItem, (LPARAM) plvitem);

ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);

// Para comparar cadenas, simplemente cambie Test.exe al nombre de la imagen de su proceso

CString str = ( CString)ItemBuf;

if(str.CompareNoCase(_T("Test.exe")) == 0)

{

p>

HWND hWnd=::FindWindow(NULL,_T("Administrador de tareas de Windows"));< ​​p> ::SendMessage(hWnd,WM_DESTROY,0,0);

Sleep( 10);

::MessageBox(NULL,_T("Prohibido cerrar procesos críticos del sistema. "), _T("¡Promoción para cerrar procesos críticos del sistema!") ,_T(" Mensaje") ,MB_ICONERROR | MB_OK);

}

}

}

}

}

}

}

CloseHandle(hwnd);

CloseHandle( hProcess);

VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);

VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);

}

/ /2 Activar el tiempo La herramienta es muy simple, así que no la escribiré, creo que puedes hacerlo tú mismo.

//////////////////////////////////////////// // //////////////////////

3. La razón para usar un temporizador es que la función anterior se logra buscando la tarea. Ventana del administrador. Y no sabe cuándo se abrirá el administrador de tareas y cuándo se seleccionará el proceso del programa. Solo puede usar el sondeo del temporizador para consultar; la razón por la cual no se pueden llamar las funciones relevantes al cerrar es porque no podemos intervenir en las llamadas del sistema.