最近遇到这个问题,Win7下UAC开启时窗口就无法响应WM_DROPFILES消息,上网搜了原因,并且将在代码上放行了DROPFILES和COPYGLOBALDATA消息。
可是在用Spy++抓窗口的消息在UAC开启的情况下还是没有抓到(关闭UAC时可以抓到功能正常),请问下有没有其它的什么原因会导致这种现象?如何解决?AllowMeesageForVistaAbove( WM_DROPFILES, TRUE );
AllowMeesageForVistaAbove( 0x0049, TRUE ); // 0x0049 - WM_COPYGLOBALDATA
bool CXXX::AllowMeesageForVistaAbove( WM_DROPFILES, TRUE )
{
typedef BOOL (WINAPI* _ChangeWindowMessageFilter)( UINT, DWORD );
HMODULE hUserMod = NULL;
BOOL bResult = FALSE;
hUserMod = LoadLibrary( "user32.dll" );
if ( hUserMod == NULL )
{       
return FALSE;
} _ChangeWindowMessageFilter pChangeWindowMessageFilter = (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter" );
if ( NULL == pChangeWindowMessageFilter  )
{       
FreeLibrary( hUserMod );
return FALSE;
} bResult = pChangeWindowMessageFilter( uMessage, bAllow ? 1 : 2 ); // 1-MSGFLT_ADD, 2-MSGFLT_REMOVE
   
    if( NULL != hUserMod )
    {
        FreeLibrary( hUserMod );
    }
    return bResult;
}

解决方案 »

  1.   

    MSDN上有一个例子
    希望对你有帮助
      

  2.   

    不好意思
    上次忘附网址了
    http://archive.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=cwmfex&ReleaseId=1846
      

  3.   

    发现WIN7中自己窗口自定义的拖动格式与WM_DROPFILES冲突,在响应自定义格式的OnDragOver( WPARAM pDropInfoClass, LPARAM lParm )后 COleDropInfo* pInfo = (COleDropInfo* )pDropInfoClass;
    ASSERT( pInfo->IsKindOf( RUNTIME_CLASS( COleDropInfo ) ) );

    UINT format = RegisterClipboardFormat( CONTACT_DATA_FORMAT );
    if( pInfo->m_pDataObject->IsDataAvailable( format ) )
    {
    return DROPEFFECT_COPY;
    }
    else
    {
            return DROPEFFECT_NONE;
    }
    消息没有被Post给OnDropFiles( WPARAM wParam, LPARAM lParam ),
    但是在XP下一切正常,请问这竟然是什么原因呢
      

  4.   

    用VS2010试了一下发现WIN7下没问题,VC6就是不行。看来跟库还有点关系
      

  5.   

    回过头来,发现之前的理解是错的,跟库没有关系,是win7中UAC机制的问题,权限低的进程无法向高权限的进程发送WM_BASE(WM_BASE以下也有部分不行)以上的消息。在设计程序的时候就要注意 http://msdn.microsoft.com/zh-cn/magazine/cc163486.aspx#S1