[MFC] Drag & Drop 구현하기 – Win 10 에서 안될 때 해결 방법

이번 글에서는 대화상자에 파일을 Drag & Drop 하는 방법을 알아보겠습니다.

대화상자 생성 후, 아래와 같이 대화상자 속성->동작->Accept FilesTRUE로 변경합니다.

그리고 아래와 같이 OnDropFiles를 추가해줍니다.

OnDropFiles에 아래와 같이 코딩합니다.

void CMFCApplication1Dlg::OnDropFiles( HDROP hDropInfo )
{
	// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
	CString sFileList(_T("")); // 파일 리스트 표시
	TCHAR szFileName[MAX_PATH] = {0, }; // 파일 명 반환할 변수
				
	int iCount = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szFileName, sizeof(szFileName) );
			// ::DragQueryFile( 핸들, 0xFFFFFFFF로 하면 드롭된 갯수 가져옴 , 파일명 반환, 버퍼 크기 );

	for ( int iIndex = 0 ; iIndex < iCount ; iIndex++ )
	{
		memset( szFileName, 0, sizeof(szFileName) );
		::DragQueryFile( hDropInfo, iIndex, szFileName, sizeof(szFileName) );

		CString sFileName;
		sFileName.Format( _T("%s"), szFileName );
		sFileList += sFileName + _T("\n");
	}

	AfxMessageBox( sFileList );

	::DragFinish( hDropInfo );

	CDialogEx::OnDropFiles( hDropInfo );
}

실행 시켜서 Drag & Drop을 확인해 봅니다.

——————————————————————————

Windows 10에서 MFC의 Drag & Drop이 안되는 경우가 있습니다.(관련 링크)

그럴 경우 OnInitDialog에 아래와 같이 추가하시면 됩니다.

ChangeWindowMessageFilterEx( m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL );
ChangeWindowMessageFilterEx( m_hWnd, 0x0049/*WM_COPYGLOBALDATA*/, MSGFLT_ALLOW, NULL );

p.s 그래도 안되면 아래와 같이 권한 상승 후 코딩해줍니다.

DragAcceptFiles(true);

ChangeWindowMessageFilterEx( m_hWnd, WM_DROPFILES, MSGFLT_ALLOW, NULL );
ChangeWindowMessageFilterEx( m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL );
ChangeWindowMessageFilterEx( m_hWnd, 0x0049/*WM_COPYGLOBALDATA*/, MSGFLT_ALLOW, NULL );