[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
' Tip' 카테고리의 다른 글
[팁] GitHub 간단 사용법 (0) | 2016.10.10 |
---|---|
[톰캣] 웹 서버 외부 접속 허용 방법 (방화벽설정) (0) | 2016.09.30 |
톰캣 start가 안될 때 (0) | 2016.05.30 |
[MFC][에러] 응용프로그램의 side-by-side 구성이 잘못되어 응용 프로그램을 시작하지 못했습니다. (0) | 2016.04.07 |
[팁] 인터넷 익스플로러 64bit로 실행하기 (0) | 2016.04.04 |