调用ChangeWindowMessageFilter函数,放行WM_DROPFILES消息和WM_COPYGLOBALDATA消息,以解决Win7系统中文件拖放失效的问题由于Win7的安全机制,导致与文件拖放的WM_DROPFILES消息和WM_COPYGLOBALDATA消息被系统拦截了,从而导致了文件拖放失效的问题。解决问题的办法就是,调用ChangeWindowMessageFilter函数,放行WM_DROPFILES消息和WM_COPYGLOBALDATA消息。相关代码如下所示。
// 放行文件拖放相关事件消息,仅对win7有效,以解决win7中文件拖放失效的问题
ChangeWndMessageFilter( WM_DROPFILES, TRUE );
ChangeWndMessageFilter( WM_COPYGLOBALDATA, TRUE ); // 0x0049 - WM_COPYGLOBALDATA
BOOL CXXXApp::ChangeWndMessageFilter( UINT uMessage, BOOL bAllow )
{
typedef BOOL (WINAPI* ChangeWindowMessageFilterFn)( UINT, DWORD );
HMODULE hUserMod = NULL;
BOOL bResult = FALSE;
hUserMod = LoadLibrary( "user32.dll" );
if ( hUserMod == NULL )
{
return FALSE;
}
// 获取ChangeWindowMessageFilter函数接口指针
ChangeWindowMessageFilterFn pfnChangeWindowMessageFilter = (ChangeWindowMessageFilterFn)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );
if ( pfnChangeWindowMessageFilter == NULL )
{
FreeLibrary( hUserMod );
return FALSE;
}
bResult = pfnChangeWindowMessageFilter( uMessage, bAllow?1:2 ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE
FreeLibrary( hUserMod );
return bResult;
}