Win8管理员启动的程序不响应拖拽消息的处理
2015-04-15 10:25
411 查看
首先,这是一个权限问题,简单理解低权限的拖拽被管理员权限的程序拒绝了~~~所以我们需要告诉这个以管理员权限启动的进程,我们需要这个消息,即使是它来自较低权限的消息,系统Api为我们提供了解决办法~~一个过滤消息的API,(微软Vista系统之后的版本有的API)
BOOL WINAPI ChangeWindowMessageFilterEx(
__in HWND hWnd,
__in UINT message,
__in DWORD action,
__inout_opt PCHANGEFILTERSTRUCT pChangeFilterStruct
);
hWnd
要修改其 UIPI 消息过滤器的窗口句柄。
message
要允许或阻止通过消息过滤器的消息。
action
要执行的操作,可以采取下列值之一:
MSGFLT_ALLOW 允许消息通过过滤器。允许窗口接收该消息,不管源消息是什么,甚至它来自一个低特权的进程。
MSGFLT_DISALLOW 如果消息来自低特权的进程,阻止它转递给窗口。
MSGFLT_RESET 为窗口重置消息过滤器为默认,任何全局允许消息或进程范围内的将通过。但不包含这两个类别,其中其中来自低特权的进程将被阻塞。
pChangeFilterStruct
指向CHANGEFILTERSTRUCT结构指针的可选项。
返回值
如果函数成功,则返回值为非零值。
如果该函数失败,则返回值为零。要获取扩展的错误的信息,请调用GetLastError .
//=======================================================================、、
百度在这里解释的很清楚,所以我就直接拷贝过来了,但是,当我去试图用这个APi过滤拖拽的时候,并没有起到应该有的效果,原来,要过滤这个拖拽消息,需要同时过滤包括拖拽消息在内的3个消息分别是:
WM_DROPFILES
WM_COPYDATA
0x0049
同时过滤这三个消息才能达到我们需要的效果,而且,需要注意的是,这个API需要我们动态的加载如:
1.在头文件内申明一个函数指针
typedef BOOL (WINAPI *LPFUNC)(HWND,UINT,DWORD,PCHANGEFILTERSTRUCT);
2.在需要过滤的敌法加载模块(这个函数在模块user32.dll内),并且找到函数在模块内的地址
至此,我们高权限的进程窗口也能接受较低权限的消息了
BOOL WINAPI ChangeWindowMessageFilterEx(
__in HWND hWnd,
__in UINT message,
__in DWORD action,
__inout_opt PCHANGEFILTERSTRUCT pChangeFilterStruct
);
参数编辑
hWnd要修改其 UIPI 消息过滤器的窗口句柄。
message
要允许或阻止通过消息过滤器的消息。
action
要执行的操作,可以采取下列值之一:
MSGFLT_ALLOW 允许消息通过过滤器。允许窗口接收该消息,不管源消息是什么,甚至它来自一个低特权的进程。
MSGFLT_DISALLOW 如果消息来自低特权的进程,阻止它转递给窗口。
MSGFLT_RESET 为窗口重置消息过滤器为默认,任何全局允许消息或进程范围内的将通过。但不包含这两个类别,其中其中来自低特权的进程将被阻塞。
pChangeFilterStruct
指向CHANGEFILTERSTRUCT结构指针的可选项。
返回值
如果函数成功,则返回值为非零值。
如果该函数失败,则返回值为零。要获取扩展的错误的信息,请调用GetLastError .
//=======================================================================、、
百度在这里解释的很清楚,所以我就直接拷贝过来了,但是,当我去试图用这个APi过滤拖拽的时候,并没有起到应该有的效果,原来,要过滤这个拖拽消息,需要同时过滤包括拖拽消息在内的3个消息分别是:
WM_DROPFILES
WM_COPYDATA
0x0049
同时过滤这三个消息才能达到我们需要的效果,而且,需要注意的是,这个API需要我们动态的加载如:
1.在头文件内申明一个函数指针
typedef BOOL (WINAPI *LPFUNC)(HWND,UINT,DWORD,PCHANGEFILTERSTRUCT);
2.在需要过滤的敌法加载模块(这个函数在模块user32.dll内),并且找到函数在模块内的地址
HMODULE hLib = ::LoadLibraryA("user32.dll"); if (hLib) { LPFUNC func = (LPFUNC)GetProcAddress(hLib, "ChangeWindowMessageFilterEx"); if (func) { func(HWND,WM_DROPFILES, 1,NULL); func(HWND,WM_COPYDATA, 1,NULL); func(pFrame->GetHWND(),0x0049, 1,NULL); } }
至此,我们高权限的进程窗口也能接受较低权限的消息了
相关文章推荐
- 解决win8/8.1程序不能以管理员权限自动启动问题
- WIN8 默认以管理员启动程序
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
- VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)
- iOS 程序未启动和在前台、后台接收到推送消息的处理方法
- 管理员权限启动Spy++,只能拦截管理员权限启动的程序的窗口消息
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
- 关于vc6程序拖拽文件WM_DROPFILE在win7,win8,vista上不能响应的解决方法
- 用非管理员权限启动主程序,并用管理员权限启动子程序,导致WM_COPYDATA消息发送失败的问题
- MFC程序的消息处理顺序
- eclipse启动tomcat程序错误处理
- [转贴]使用C#和MSMQ开发消息处理程序
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- 单线程程序处理消息的方式!
- PetShop程序中的购物车和订单处理模块(Profile技术,异步MSMQ消息)
- Vista之前的版本,默认本地登陆用户都以管理员权限启动程序
- windows程序消息处理流程
- VB为自己的程序设定消息(可接收处理)
- MFC程序的消息处理顺序
- Duilib学习笔记《05》— 消息响应处理