I am Pengrammer :)

Tip

[팁][MFC] 드래그 앤 드랍이 구현 안될 때

펭구 2016. 9. 26. 11:17

 

[MFC] Drag&Drop이 구현이 안될 때

 

 


 

 

 

 

 

Windows Vista 이상에서 드래그 앤 드랍이 동작하지 않는 증상

1. 드래그  드롭을 분명히 구현하고 프로젝트를 실행시켰는데파일을 다이얼로그에 드래그하면 +표시만 나오고 드래그  드롭에 대한 이벤트는 발생되지 않는다.

2. 텍스트 파일을 노트패드에 드래그하면 드롭이 되지 않는다.

 

 

 

 

해당 증상의 이유

사용자 권한의 프로세스에서 관리자 권한의 프로세스에 드래그 앤 드롭하는 경우이다.

텍스트 파일을 관리자 권한으로 실행된 노트패드에 드래그 앤 드롭하면 실행되지 않는 증상과 같다. 

해당 증상은 Windows Vista 이상부터 나타나며, 

Windows Vista 이상부터 적용된 사용자 인터페이스 권한 격리(UIPI)라는 보안정책 때문이다. 

참고 : 사용자 인터페이스 권한 격리(User Interface Privilege Isolation; UIPI) - 위키백과

 

 

 

 

 

해결 방법

 

1. ChangeWindowMessageFilter 명령어를 통해 높은 신뢰 등급 프로세스가 상대적으로 낮은 신뢰 등급 프로세스가 생성한 메시지를 받을 수 있도록 중간 신뢰 등급 프로세스(인터넷 익스플로러 보호 모드를 제외한 모든 비상승 프로세스)의 메시지를 변환할 수 있다.

MFC 다이얼로그로 드래그 앤 드랍을 구현 중이라면, 아래

 소스코드를 추가해주면 해결된다. 


2.  UAC를 꺼두면 된다. 하지만 좋은 방법이 아니다.

 

 

 

샘플 코드 

WM_DROPFILES과 관련된 메시지를 필터에 걸리지 않도록 하는 소스이다.

 

1. 다음 코드를 dlg.cpp의 맨 위에 추가한다.

#ifndef WM_COPYGLOBALDATA #define WM_COPYGLOBALDATA 0x0049 #endif #ifndef MSGFLT_ADD #define MSGFLT_ADD 1 #endif  typedef BOOL (WINAPI *pfnChangeWindowMessageFilter)(UINT, DWORD);

 

2. OnInitDialog 함수 내에 다음 코드를 추가한다.

HMODULE hUser32Mod = LoadLibrary("USER32.DLL");  if (hUser32Mod != NULL) {   pfnChangeWindowMessageFilter pChangeWindowMessageFilter =    (pfnChangeWindowMessageFilter)GetProcAddress(hUser32Mod, "ChangeWindowMessageFilter");    if (pChangeWindowMessageFilter != NULL) {    pChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);    pChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);    pChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);   }  }

 

 

 

 

+ Reference

1. XeroNic(HS)'s BLOG