[프로그램 얼려(freeze) 버리기]
어떤 프로그램을 아무 동작 못하게 잠시 멈추고자 한다면 어떻게 해야할까?
win32에서 작업은 thread단위로 돌라간다.
그러므로 process의 thread들을 모두 suspend시키면 프로그램이 멈춰있게 되지 않을까?
이 기능의 api가 SuspendThread , ResumeThread 라고 있다.
아래는 코드는 메모장을 잠시 suspend시켰다가 다시 resume시키는 샘플이다.
어디에 쓸데 있을지 모르겠지만
델마당 Q&A게시판의 질문을 보고 한번 코딩해 보았다.
#include "TlHelp32.h"
DWORD ProcessId;
HANDLE hProcess;
HWND hWnd;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
hWnd=FindWindow(NULL,"제목 없음 - 메모장");
if(hWnd)
{
GetWindowThreadProcessId(hWnd, &ProcessId); // hWnd로 프로세스 ID를 얻음..
HWND hsnapshot = NULL;
HWND hTred = NULL;
THREADENTRY32 ThredInfo;
ThredInfo.dwSize = sizeof(ThredInfo);
hsnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hsnapshot == NULL)
{
CloseHandle(hsnapshot);
return ;
}
bool status = Thread32First(hsnapshot, &ThredInfo);
while(status)
{
if(ThredInfo.th32OwnerProcessID== ProcessId)
{
hTred=OpenThread(THREAD_ALL_ACCESS,FALSE, ThredInfo.th32ThreadID);
SuspendThread(hTred);
}
status = Thread32Next(hsnapshot, &ThredInfo);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(hWnd)
{
GetWindowThreadProcessId(hWnd, &ProcessId); // hWnd로 프로세스 ID를 얻음..
HWND hsnapshot = NULL;
HWND hTred = NULL;
THREADENTRY32 ThredInfo;
ThredInfo.dwSize = sizeof(ThredInfo);
hsnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hsnapshot == NULL)
{
CloseHandle(hsnapshot);
return ;
}
bool status = Thread32First(hsnapshot, &ThredInfo);
while(status)
{
if(ThredInfo.th32OwnerProcessID== ProcessId)
{
hTred=OpenThread(THREAD_ALL_ACCESS,FALSE, ThredInfo.th32ThreadID);
ResumeThread(hTred);
}
status = Thread32Next(hsnapshot, &ThredInfo);
}
}
}
//---------------------------------------------------------------------------
그럼...
|