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

C++빌더 Q&A
C++Builder Programming Q&A
[28039] Re:[질문]작업 관리자 에서 실행 파일 죽이기
유영인 Cuperido [cuperido] 1649 읽음    2003-12-01 18:44
답변을 아마 예전에 제가 한듯.. :)
그냥 사용하던 루틴을 올리다 보니 필요없는 부분들이 있네요.

SpeedKeyOff();
- 이 함수는 없어도 되는 함수입니다.

hdHandle = FindWindow(NULL, "프로그램 1");
if(!hdHandle) hdHandle = FindWindow(NULL, "프로그램 2");

- 두번째 줄도 없어도 무관합니다.

그리고 첫번째 줄에서

hdHandle = FindWindow(NULL, "프로그램 1");

라는 부분이 있는데, FindWindow라는 함수는 해당하는 윈도우를
찾아내는 함수로 클래스이름, 캡션 이름을 토대로 찾을 수 있습니다.

FindWindow 의 인자의 첫번째는 클래스이름, 두번째는 캡션이름입니다.
예제에서는 클래스이름에 NULL을 주고 캡션이름으로 찾아내는 예저입니다.

클래스이름이란 Winsight나 Spy 같은 프로그램으로 해당하는 클래스를 찾아낼 수 있습니다.
단적인 예를들어, Object Inspecter에서 폼의 이름을 Form1에서 Main으로 바꾸면,
위의 전체 리스트가 나오는 콤보박스가 TForm1 에서 TMain 으로 클래스 이름이 바뀌는것을
보실 수 있습니다. 이렇게 TMain 정해진 것이 새로운 클래스 이름이 되는 것입니다.
일반적인 디자인 형태에서는 폼만 클래스이름을 변경할 수 있고, 다른 Edit 같은 경우에는
TEdit등으로 이미 정해져 있는 클래스를 사용합니다.

캡션은 윈도우 상단에 있는 글자를 뜻합니다. html태그에서 head태그 로 변경하는 부분..
그러니까, 메모장을 실행시키면 "제목없음 - 메모장" 이렇게 나오는 이 글자를 입력하시면
됩니다.

hdHandle = FindWindow(NULL, "프로그램 1");

이 부분을

hdHandle = FindWindow(NULL, "제목없음 - 메모장");

이렇게 바꾸신다면, (파일 이름을 바꾸지 않은.. 만약 그렇다면 캡션이 파일 이름으로 바뀌니)
메모창이 있다면 이 메모창을 FindWindow로 찾아서 그 핸들을 hdHandle 로 넘겨줍니다.

그러면 그 아래 부분부터 종료 처리를 하게 되는 것이구요.

넘겨주는 인자인 blRoot는 간혹가다 프로그램이 바로 종료되지 않는 경우가 있어서
이 경우 다시 종료를 하려고 만든 코드입니다. SpeedKeyOff() 이 함수 대신에 루프가 계속돌아서
멈추는 현상을 방지하기위해 Sleep(1000); 등을 넣어 주시는 것도 좋습니다.

정리하자면..

FindWindow 부분의 소스 코드를 종료시킬 어플리케이션에 맞도록 설정을 하신후...

KillHandle(true);

이런식으로 호출하시면 됩니다.
true를 계속 넘겨주시기가 복잡하다고 생각되실 경우에 헤더에만

void __fastcall TMain::KillHandle(bool blRoot = true);

이런식으로 설정해 주시면...

KillHandle();

이런식으로 호출하시면 자동적으로 true 로 넘어갑니다.


cuperido


조진수 님이 쓰신 글 :
:  아래 내용은 다른 분의 답변을 가져 온 것입니다. 그런데 무슨 말인지... 완젼히 낫놓고 기억자도 모르는
:
:  것 같아 답답하군여....
:
:  제가 듣고 싶은 답변은 아래 함수를 어떻게 실행해야 될지 모르겟습니다.   즉, 제가 KillHandle() 를
:
:  호출하는건지 아니면 어떻게 자동으로 호출이 되는지....
:
:  제가 잘 이해를 하지 못해서 질문이 애메하군여.....   제가 하려는건 Os에서 윈도우를 종료시면 프로그램
:
:  을 종료 시키기 위해서 입니다. 답변 부탁드립니다.
:
: ///////////////////////////////////////////////////////////////////////////////////////////////////
:
: 98에서는 간단히 죽이면 되지만, 2000에서는 프로세스를 얻은 다음 처리를 해야 하기 때문에 조금 복잡합니다. 아래 소스로 98, 2000에서 모두 사용하실 수 있으실 것 같습니다.
:
: 아래 소스는 "프로그램 1", "프로그램 2" 를 모두 죽이는 소스입니다.
:
:
: void __fastcall TMain::KillHandle(bool blRoot)
: {
:
: HWND              hdHandle;
: HANDLE            hdProcess;
: DWORD             dwPID;
:
:
:
: SpeedKeyOff();
:
: hdHandle = FindWindow(NULL, "프로그램 1");
: if(!hdHandle) hdHandle = FindWindow(NULL, "프로그램 2");
:
: if(hdHandle) {
:    GetWindowThreadProcessId(hdHandle, &dwPID);
:
:    if(dwPID) {
:      hdProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID);
:      TerminateProcess(hdProcess, -1);
:    }
:
:    KillHandle(false);
: }
:
: return;
:
: }

+ -

관련 글 리스트
28038 [질문]작업 관리자 에서 실행 파일 죽이기 조진수 983 2003/12/01
28039     Re:[질문]작업 관리자 에서 실행 파일 죽이기 유영인 Cuperido 1649 2003/12/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.