首先,这是一个权限问题,简单理解低权限的拖拽被管理员权限的程序拒绝了~~~所以我们需要告诉这个以管理员权限启动的进程,我们需要这个消息,即使是它来自较低权限的消息,系统Api为我们提供了解决办法~~一个过滤消息的API,(微软Vista系统之后的版本有的API)
BOOL WINAPI ChangeWindowMessageFilterEx(
__in HWND hWnd,
__in UINT message,
__in DWORD action,
__inout_opt PCHANGEFILTERSTRUCT pChangeFilterStruct
);
参数编辑
指向CHANGEFILTERSTRUCT结构指针的可选项。
百度在这里解释的很清楚,所以我就直接拷贝过来了,但是,当我去试图用这个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);
}
}
至此,我们高权限的进程窗口也能接受较低权限的消息了