我构建了一个winforms应用程序,并实现了拖放功能。此功能在WinXP或Win7中从Run-As-Administrator应用程序中运行良好。
当从Win7中的非管理应用程序拖到我的程序时,问题就变成了,它只是不起作用。
我理解这是因为操作系统会过滤消息。我在这里找到了一个解决方案:http://blog.helgeklein.com/2010/03/how-to-enable-drag-and-drop-for.html但它似乎不起作用。
这是解决方法代码:
[DllImport("user32.dll", SetLastError = true)]
static extern bool ChangeWindowMessageFilter(uint message, uint dwFlag);
private const uint WM_DROPFILES = 0x233;
private const uint WM_COPYDATA = 0x004A;
private const uint WM_COPYGLOBALDATA = 0x0049;
private const uint MSGFLT_ADD = 1;
ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYGLOBALDATA, MSGFLT_ADD);
如何让它发挥作用?
答案 0 :(得分:7)
是的,你正在与UIPI作战,这是UAC的一个方面,它可以阻止未经高速发展的程序劫持高架程序的资源。是的,ChangeWindowMessageFilter()允许您绕过Windows邮件的此限制。
但是,OLE拖放不使用Windows消息。它使用回调,查看RegisterDragDrop()的文档以获取详细信息。这个微软blog post告诉你,虽然它打开了CWMF的大门,但你已经搞砸了。但是,如何获取WM_DROPFILES消息对我来说完全不清楚。在示例Windows窗体应用程序中使用DragAcceptFiles()没有明显的效果。