|
답변을 아마 예전에 제가 한듯.. :)
그냥 사용하던 루틴을 올리다 보니 필요없는 부분들이 있네요.
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;
:
: }
|