Cómo evitar mediante programación que los archivos ejecutables se cierren en el Administrador de tareas (c++)
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.