繁体   English   中英

Ole拖放故障排除

[英]Ole drag & drop troubleshooting

我使用WTL创建了一个Dialog,继承自CDialogImpl类,在主对话框中创建了另一个对话框,在第二个子对话框中创建了一个列表控件。 我想在列表控件中添加拖放功能,我已经在网上阅读了关于WM_DROPFILES方法和关于Ole Drop Target的信息,我选择了后者。 我已经按照这个实现了IDropTarget接口方法。 我在所有对话中都将accept files选项设置为TRUE,我在子对话类中实例化了IDropTarget,并在其WM_INITDIALOGUE处理程序中调用了以下方法:

//drag& drop 
        lpDropTarget = (LPDROPTARGET)new TDropTarget(m_hWnd);
        CoLockObjectExternal(lpDropTarget, true, true);

        // register the HWND as a drop target
        RegisterDragDrop(m_hWnd, lpDropTarget);

lpDropTarget实例化如下:

LPDROPTARGET lpDropTarget;

这就是它。 之前没有真正使用过Ole,所以我尝试了以下场景来寻找运气:

  1. 我已经使用RegisterDragDrop注册List控件HWND并设置它的父对话框以接收我发送的通知WM_OLEDROP WM_USER + 1 确定拖放的光标显示但没有调用IDataTarget函数的实现。

  2. RegisterDragDrop也可用于儿童对话和通知。

  3. RegisterDragDrop也是主对话框和通知。

在后面的情况下(2和3),甚至没有出现用于拖放的光标,它向我显示了没有拖放的允许的光标。 现在,所有对话和列表控件都已设置为接受来自visual studio设计器的文件。 我只能使用ATL / WTL / WINAPI,没有MFC。 我究竟做错了什么?

对你来说, WM_DROPFILES是你唯一需要处理的东西。 无需使用IDropTarget等。

如果您的应用程序不需要在管理员模式下运行,请不要在管理员模式下运行它。 禁用相同的链接器设置( UAC Execution Level = asInvoker )。 此外,在非管理员模式下运行VS,以便您的应用程序也启动非管理员进程。 这样,Explorer.exe就能够向您的应用程序发送WM_DROPFILES消息。

如果您的应用程序需要以管理员模式运行,则需要允许其他应用程序向您的应用程序(窗口)发送一些消息。 请执行下列操作:

ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD);

您可能还想使用更新的函数: ChangeWindowMessageFilterEx

请注意,如果您的应用程序必须以Admin身份运行,并且您需要使用GetProcAddress动态定位其中一个函数,那么您的应用程序可以在没有此功能的操作系统上运行(例如Windows XP)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM