Ole拖动;丢弃故障排除

时间:2012-11-26 17:37:48

标签: c++ winapi atl wtl

我使用WTL创建了一个Dialog,继承自CDialogImpl类,在主对话框中我创建了另一个对话框,在第二个子对话框中有一个列表控件。我想添加阻力和放大器删除列表控件的功能,我已经在网上阅读了有关WM_DROPFILES方法和关于Ole Drop Target的信息,我选择了后者。 我已根据this实现了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。好的光标是拖动和放大drop显示但没有调用IDataTarget函数的实现。

  2. 用于儿童对话的RegisterDragDrop&它的通知也是。

  3. RegisterDragDrop用于主对话框&它的通知也是。

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

1 个答案:

答案 0 :(得分:3)

对你来说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) )。