Post List

2014년 12월 25일 목요일

Windows 버전 확인하여 메세지 받기

Windows 7 이후 UAC를 제대로 지원하기 위해서 프로그램을 수정해야 하기때문인데, 그중 하나가 권한이 높은 프로세스로 메세지를 보낼 수 없다는 것다. MSDN에서 찾아보면 User Interface Privilege Isolation(UIPI)라고 소개되어 있다.

그 방법에 대해서는 Window7 이상에서 File Drag & Drop이 안될 때 를 참조하기 바란다.

 만일 권한이 낮은 프로세스의 메세지를 받고 싶다면 ChangeWindowMessageFilter를 이용하여 권한이 높은 프로세스에서수신하고싶은 메세지를 등록해야 한다. 하지만 이 함수는 Window XP에는 존재하지 않기에 윈도우의 버전을 구분해서 비스타 이상인 경우만 사용해야 한다.

OS의 버전을 확인하기위해 보통은 이렇게 사용한다.

OSVERSIONINFOEX osVer = { sizeof(OSVERSIONINFOEX), };
::GetVersionEx ((OSVERSIONINFO*) &osVer);

if (osVer.dwMajorVersion>= 6)
{
 // 비스타 or 윈도우7
}
else
{
 // XP or 그 이하
}

  하지만 위와 같이 구현하면 XP에서는 오류가 날 것이다. 왜냐면 ChangeWindowMessageFilter 라는 함수는 USER32.DLL 파일에 있는데 그 파일이 XP에는 없기 때문이다. 이럴경우 해당 함수를 동적으로 읽어서 함수포인터를 이용해서 실행하는 형식으로 코드를 바꿔줘야한다. 그리고 버전 확인 또한 위와 같이 하는게 아니라 해당 함수의 존재 유무로 하면 될 것이다.

BOOL (WINAPI *pfn)(UINT,DWORD);
HMODULE hUSER32= LoadLibrary(_T("USER32.DLL"));

if (hUSER32)
  pfn = (BOOL (WINAPI *)(UINT,DWORD)) GetProcAddress(hUSER32, _T("ChangeWindowMessageFilter"));
  if (pfn)
  {
    // 비스타 또는이후 버전 윈도우
    pfn (WM_COPYDATA,1 /* MSGFLT_ADD */);
    pfn (WM_MY_BNA,1 /* MSGFLT_ADD */);

    FreeLibrary(hUSER32);
  }
}




참조 : http://skysblue.tistory.com

댓글 없음:

댓글 쓰기