Congelare e riattivare un programma sembra una cosa piuttosto semplice con i nuovi sistemi operativi, ma io ho bisogno di compiere questo task sotto Windows 98.
Ho provato con questo codice, ma non funziona....
Qualcuno ha qualche idea che possa aiutarmi, grazie?
- Codice: Seleziona tutto
// freeze98.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//maurizio
#include "windows.h"
#include <tlhelp32.h>
#include <iostream>
using std::cout;
using std::endl;
//maurizio
int main(int argc, char* argv[])
{
int codeclef=35;
bool PrimaVolta; //global variable
HWND Handle_Win_Game;//this is a GLOBAL variable
HWND MainWnd;
unsigned long dwProcessIdgame;
PrimaVolta=true;
// VK_MULTIPLY corrisponde al * del tast.numerico
// codeclef==35 corrisponde al tasto END
Sleep (2000);
while (GetAsyncKeyState(codeclef) == 0)
{ /* attendi e basta!!!*/ }
if (PrimaVolta == true)
//ovvero: una volta che si e' attivato il debugger
//non si puo' piu' cambiare idea!!!!
{
PrimaVolta=false;
//Ottengo l'handle alla finestra del gioco
//che sta attualmente girando
Handle_Win_Game=::GetForegroundWindow();
///Aggiunta per il debugger
MainWnd=::GetForegroundWindow();
//Qui otteniamo il PID del gioco
//Questa funzione ritorna un TID (identificativo del
//thread, che comunque non e' un handle, che ha creato
//la finestra il cui handle e' stato specificato), e
//l'indirizzo della stringa definita nel 2^ parametro
//viene riempito con il PID del processo che ha creato
//la finestra; tutti e due i valori sono riportati
// sotto forma di DWORD
//unsigned long dwProcessIdgame;
::GetWindowThreadProcessId(Handle_Win_Game,&dwProcessIdgame);
//MessageBox("premuta hotkey");
//A questo punto se tutto e' filato liscio, la variable
//dwProcessIdgame contiene il PID del gioco
//PrimaVolta = true;
::SetFocus(Handle_Win_Game);
::SetForegroundWindow(Handle_Win_Game);
::ShowWindow(Handle_Win_Game,SW_SHOWMINIMIZED);
::ShowWindow(Handle_Win_Game,SW_SHOWMAXIMIZED);
::ShowWindow(Handle_Win_Game,SW_RESTORE);
::ShowWindow(Handle_Win_Game,SW_SHOW);
::SetFocus(Handle_Win_Game);
::SetForegroundWindow(Handle_Win_Game);
DWORD TargetPid = dwProcessIdgame;
DebugActiveProcess(TargetPid);
// VK_MULTIPLY corrisponde al * del tast.numerico
while (GetAsyncKeyState(VK_MULTIPLY) == 0);
{ /* attendi e basta!!!*/ }
HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap != INVALID_HANDLE_VALUE)
{
THREADENTRY32 te;
te.dwSize = sizeof(te);
if (Thread32First(hThreadSnap , &te))
{
do
{
//in THREADENTRY32 structure there is a member called th32OwnerProcessID
//you can check owner process of thread like this:
if (te.th32OwnerProcessID == TargetPid)
{
cout << te.th32ThreadID <<"\n" ;
// printf( TEXT("\n base priority = %d"), te32.tpBasePri );
//printf( TEXT("\n delta priority = %d"), te32.tpDeltaPri );
//HANDLE ThreadToResume = te.th32ThreadID;
//ResumeThread(ThreadToResume); // then resume thread
ResumeThread((HANDLE) te.th32ThreadID); // then resume thread
//wprintf(L"Process %u IdThred=%u\n", te.th32OwnerProcessID, te.th32ThreadID);
}
} while (Thread32Next(hThreadSnap , &te));
}
CloseHandle(hThreadSnap );
}
};//end if (PrimaVolta == true)
//}//end while (GetAsyncKeyState(codeclef) == 0)
return 0;
}