[MFC] 드래그 앤 드랍이 구현 안될 때
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
'Programming > MFC' 카테고리의 다른 글
[MFC] 다이얼로그에 Drag and Drop 구현 (0) | 2022.01.11 |
---|---|
[MFC] 트리 확장/축소하기 (0) | 2022.01.11 |
다이얼로그 탭 순서(Dialog Tab Order) 지정하기 (0) | 2022.01.11 |
[MFC][에러] 응용프로그램의 side-by-side 구성이 잘못되어 응용 프로그램을 시작하지 못했습니다. (0) | 2022.01.11 |
test 글입니다. (0) | 2018.07.04 |