如何让程序打开我拖放给程序窗口上的文件

void_main_void 2015-09-26 05:50:28
如何让运行的程序打开我点击鼠标拖动文件到程序窗口上,程序就打开我拖动的文件、??

等价于,我打开看图软件,然后鼠标点击一张图片拖动到看图软件上,然后松开鼠标,看图软件就打开我拖动的图。。

有没有类似功能的API能调用?
...全文
277 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tulingwangbo 2016-11-08
  • 打赏
  • 举报
回复
4楼回复的方法确实可以实现跨进程拖拽文件(比如进程A中拖到进程B中),但现在有个问题,进程A的界面比较大,那么从A拖动文件到B时候因为B最小化了,我就拖到任务栏B的图标位置,如何让B弹出并置为前端窗口,尝试了遍历任务栏进程的方法,不太好使,我看了百度云客户端等软件,都可以跨进程拖拽,比如百度云拖动到windows文件夹、浏览器等都可以;而且人家都还有提示功能,比如拖动到浏览器,鼠标还未松开,浏览器就会变色并提示“即将打开文件**”等,这个怎么做到啊?
schlafenhamster 2015-09-27
  • 打赏
  • 举报
回复
typedef struct _DROPFILES { DWORD pFiles; POINT pt; BOOL fNC; BOOL fWide; } DROPFILES, FAR * LPDROPFILES;
schlafenhamster 2015-09-27
  • 打赏
  • 举报
回复
DROPFILES 是什么 ?定义?
void_main_void 2015-09-26
  • 打赏
  • 举报
回复
引用 5 楼 dustpg 的回复:
lz说清楚一点啊, 那就是模拟则三个消息, 不过都要目标程序支持才行. 1. main参数, 创建进程, 某参数就是文件路径 2. 消息, 传递WM_DROPFILES消息, 3. COM接口, 使用SHDoDragDrop/DoDragDrop
dustpg 2015-09-26
  • 打赏
  • 举报
回复
lz说清楚一点啊, 那就是模拟则三个消息, 不过都要目标程序支持才行. 1. main参数, 创建进程, 某参数就是文件路径 2. 消息, 传递WM_DROPFILES消息, 3. COM接口, 使用SHDoDragDrop/DoDragDrop
void_main_void 2015-09-26
  • 打赏
  • 举报
回复
提了两个问题最后被自己给找到了 上一个帖子:http://bbs.csdn.net/topics/391834434 两个帖子,一人5分。 总共75分散了。顶一贴。让更多人看到。 解决方案

    int                  nResult = FALSE;
    HWND                 hMain = NULL;
    char                 szFile[MAX_PATH] = "D:\\xxx.xxxe";
    DWORD                dwBufSize   =   0;//sizeof(DROPFILES)   +   sizeof(szFile)   +   1;  
    BYTE                 *pBuf   =   NULL; 
    DWORD                dwProcessId = 0;  

    HANDLE               hProcess    = 0;

    LPSTR                pszRemote = NULL; 
    DROPFILES   *pDrop;

    dwBufSize = sizeof(DROPFILES) + strlen(szFile) + 1;


    pBuf   =   new   BYTE[dwBufSize];
    if (pBuf == NULL)
        goto Exit0;

    memset(pBuf,0,dwBufSize);
    pDrop   =   (DROPFILES   *)pBuf; 
    pDrop->pFiles = sizeof(DROPFILES);
    strcpy((char   *)(pBuf   +   sizeof(DROPFILES)),   szFile);  


    hProcess   =   OpenProcess(PROCESS_VM_OPERATION   |   PROCESS_VM_WRITE,   FALSE,  11496); 
    if (hProcess == 0)
    {
        goto Exit0;
    }
    pszRemote   =   (LPSTR)VirtualAllocEx(hProcess,   NULL,   dwBufSize,   MEM_COMMIT,   PAGE_READWRITE); 

    if (NULL == pszRemote)
    {
        goto Exit0;
    }

    if(WriteProcessMemory(hProcess,   pszRemote,   pBuf,   dwBufSize,   0))
    {
        ::SendMessage((HWND)0x000A0B5A, WM_DROPFILES, (WPARAM)pszRemote, NULL);
    }
    else
    {
        goto Exit0;
    }
    nResult = TRUE;

Exit0:
    if (pBuf)
    {
        delete [] pBuf;
        pBuf = NULL;
    }
    return nResult;

void_main_void 2015-09-26
  • 打赏
  • 举报
回复
引用 1 楼 dustpg 的回复:
lz不是问过么, 沙发的回答是DragAcceptFiles.然后处理WM_DROPFILES 事件. lz又说直接拖到exe程序图标上, 我说就是main参数. 还有一种通用的拖拽, 可以拖拽任何东西(比如文字)的是RegisterDragDrop, 需要自己实现IDropTarget接口.
我这只清楚MFC设置消息DragAcceptFiles.和处理WM_DROPFILES 可以让程序支持用户拖动文件到自己写的程序上来,然后得到拖放的文件信息。 我提问的是, 自己拖放一个文件到【别人的界面上,别人的界面能接受到我拖放文件的信息】 这是手动操作。如果我想用代码来模拟,将一个文件拖放到别人的窗口上让别人的程序知道了我拖放了文件到他的界面上改如何写代码。。。。
worldy 2015-09-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/worldy/article/details/13769223
dustpg 2015-09-26
  • 打赏
  • 举报
回复
lz不是问过么, 沙发的回答是DragAcceptFiles.然后处理WM_DROPFILES 事件. lz又说直接拖到exe程序图标上, 我说就是main参数. 还有一种通用的拖拽, 可以拖拽任何东西(比如文字)的是RegisterDragDrop, 需要自己实现IDropTarget接口.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧