您的位置:首页 > 其它

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内),并且找到函数在模块内的地址

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


至此,我们高权限的进程窗口也能接受较低权限的消息了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: