C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[717] [Win32] 프로그램 얼려(freeze) 버리기
장성호 [nasilso] 8285 읽음    2007-10-15 22:14
[프로그램 얼려(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);

         }
    }

}
//---------------------------------------------------------------------------

그럼...
조대현.Clau [casanebula]   2007-10-16 13:35 X
오.. 장난(?)치기에 잼있겠군요. 아니면 원하지 않는 프로그램을 정지시킬수도 있겠구요.

+ -

관련 글 리스트
717 [Win32] 프로그램 얼려(freeze) 버리기 장성호 8285 2007/10/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.