• 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);



  • 相关阅读:
    nginx location 语法
    nginx 日志文件
    nginx 配置文件详解
    mysql分区partition
    MySQL跳过密码登录
    min/max优化,count ,group by
    in型子查询陷阱,exists子查询
    explain分析sql效果
    HDU2896 病毒侵袭 —— AC自动机
    二分图之 多重匹配 和 最大权匹配 等总结
  • 原文地址:https://www.cnblogs.com/ggzone/p/4052444.html
Copyright © 2020-2023  润新知