GSI

윈도우 찾아서 종료 시키기

인스톨 프로그램과 비슷한 경우를 보면 해당 실행파일을 업데이트 할 경우가 생기게 되는데 이때 실행 파일을 종료 하고 새로운 파일을 추가한 후에 다시 실행시켜야 하는 경우가 발생 한다.

그래서 화면에 떠 있는 응용 프로그램의 타이틀이나 클래스를 검색 해서 프로세스 아이디를 얻은 다음에 프로세스를 종료 시켜야 한다.

프로그램을 실행하고 Spy++로 보게 되면 아래와 같이 보이게 됩니다.

사용자 삽입 이미지




여기서 나오는 "TestRemoteClose" 와 "#32770" 두개를 접근해서 프로세스를 처리할 수 있습니다.

아래의 함수는 os에서 현재 돌아가고 있는 각종 윈도우를 순회 하면서 내가 원하는 윈도우를 찾아 주는 코드 입니다.

BOOL CALLBACK SearchWindowProc (HWND hWnd, LPARAM lParam)
{
 char szClassName[1024]={0,}, szTitle[1024]={0,};
 char *pTitle = "TestRemoteClose", *pTitle2 = "TestRemoteClose";
 char *pDest = NULL, *pDest2 = NULL;

 GetClassName (hWnd, szClassName, sizeof(szClassName));
 GetWindowText (hWnd, szTitle, sizeof(szTitle));

#ifdef _DEBUG
 char szBuf[2048];
 wsprintf (szBuf, "Title: [%s],\tClass: [%s]\n", szTitle, szClassName);
 OutputDebugString (szBuf);
#endif

 pDest = strstr (szTitle, pTitle);
 pDest2 = strstr (szTitle, pTitle2);

 // Title 의 값에서 pTitle, pTitle2의 값을 검사해서 NULL인지를 검사한다.
 // 즉, NULL 이 아니면 해당 윈도우라고 판단한다.
 if (pDest != NULL || pDest2 != NULL) {

  //if (!strcmp (szClassName, "IEFrame")) // 웹일 경우 IEFrame로 되어 있다.
  {

   if (bIsMsgBox == false) {
    bIsMsgBox = true;
    MessageBox (NULL, "정상적인 설치를 위하여 잠시 종료합니다.", "설치 정보", MB_ICONINFORMATION);
   }

   DWORD dwProcessId = 0;
   GetWindowThreadProcessId (hWnd, &dwProcessId);

   if (dwProcessId)
    UserTerminateProcessId (dwProcessId);
  }
 }

 return TRUE;
}

// 메인쪽에서 아래 함수를 호출하면서 순회 하게 된다.
EnumWindows (SearchWindowProc, NULL);

더 자세한 내용이나 수정해야될 부분이 있다면 코멘트 부탁 드립니다.

Posted by gsi
: