zoukankan      html  css  js  c++  java
  • WTL在Win8.1系统WM_DROPFILES无法响应的解决办法

    由于UAC的限制,WM_DROPFILES只能由权限较低的APP拖拽到权限较高的APP,反之如果从权限较高的APP拖拽到低权限的APP上,WM_DROPFILES不会被发送到低权限的APP消息队列。所以,WM_DROPFILES会有时候变得不能响应。

    解决的办法,使用ChangeWindowMessageFilter注册WM_DROPFILES这个MEESSAGE。

    ChangeWindowMessageFilter是Vista以后的一个API,WinXP下并没有。

    这个API在User32.dll中,使用时LoadLibrary,GetProcAddress得到函数地址就能使用。

    1、在你的程序中添加以下函数:

    //register global messages for vista win7 win8.1
    typedef BOOL(WINAPI *_ChangeWindowMessageFilter)(UINT message, DWORD dwFlag);.
    BOOL AllowMeesageForVistaAbove(UINT uMessageID, BOOL bAllow)
    {
        BOOL bResult = FALSE;
        HMODULE hUserMod = NULL;
        //vista and later
        hUserMod = LoadLibrary(_T("user32.dll"));
        if( NULL == hUserMod )
        {
            return FALSE;
        }
       
        _ChangeWindowMessageFilter pChangeWindowMessageFilter =
            (_ChangeWindowMessageFilter)GetProcAddress( hUserMod, "ChangeWindowMessageFilter");
        if( NULL == pChangeWindowMessageFilter )
        {
            return FALSE;
        }
        bResult = pChangeWindowMessageFilter( uMessageID, bAllow ? 1 : 2 );//MSGFLT_ADD: 1, MSGFLT_REMOVE: 2
       
        if( NULL != hUserMod )
        {
            FreeLibrary( hUserMod );
        }
    
        return bResult;
    } 
    2、头文件定义以下宏 :

    #define MSGFLT_ADD 1
    
    #define MSGFLT_REMOVE 2

    3、在OnInitDialog中添加函数调用:

    AllowMeesageForVistaAbove(SPI_SETANIMATION, MSGFLT_ADD);
    
    //allow drop files
    AllowMeesageForVistaAbove(WM_DROPFILES, MSGFLT_ADD);



  • 相关阅读:
    ie6内存泄漏问题的解决
    精简版拖动
    【转】在ASP.Net中写系统日志
    转 集中遍历遍历datatable的方法
    水晶报表字段为空时设置默认值
    数据库一种IN查询
    两种获得路径的测试
    整理——ASP.net UTF8支持
    Subversion svnserve 服务配置 整理
    [转自CSDN] SQL基础> 约束(CONSTRAINT)
  • 原文地址:https://www.cnblogs.com/ggzone/p/10121360.html
Copyright © 2011-2022 走看看