最新消息:想得多,做的少。一天到晚瞎鸡巴搞。

模拟鼠标拖送功能

Windows编程 阿虚 631浏览 0评论

.     以前写过一篇笔记MFC下让支持拖入文件功能《MFC程序添加文件拖入功能》,最近做项目时候有个要求就是需要实现鼠标拖入文件给其他的程序需要用代码来实现。

.     C++代码,纯纯的API代码。主要还是通过SendMessage来发送WM_DROPFILES消息给支持拖入文件的程序。

DWORD __stdcall SendxxxFile(LPVOID lpThreadParameter)
{
    DWORD pid = ((tagSendInfo*)lpThreadParameter)->m_pid;
    HWND hWnd = ((tagSendInfo*)lpThreadParameter)->m_hWnd;

    bool ret = false;
    HANDLE hProcess;
    LPSTR pszRemote;

    WCHAR path[MAX_PATH];
    ::GetCurrentDirectory(MAX_PATH, path);
    wcscat(path, L"\\XXX\\YYY.ZZZ");

    char szFile[MAXBYTE];
    CClientWindow::WCHAR_CHAR(szFile, path);

    DROPFILES *pDrop;
    DWORD dwBufSize = sizeof(DROPFILES) + strlen(szFile) + 1;

    BYTE *pBuf = new BYTE[dwBufSize];
    if (pBuf == nullptr)
        goto _Exit;

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

    hProcess = ::OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, pid);
    if (hProcess == 0)
        goto _Exit;

    pszRemote = (LPSTR)::VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
    if (NULL == pszRemote)
        goto _Exit;

    if (::WriteProcessMemory(hProcess, pszRemote, pBuf, dwBufSize, 0))
        ::SendMessage(hWnd, WM_DROPFILES, (WPARAM)pszRemote, NULL);
    else
        goto _Exit;

    ret = true;

_Exit:
    if (pBuf != nullptr)
        delete pBuf;

    if (hProcess != INVALID_HANDLE_VALUE)
        ::CloseHandle(hProcess);

    delete ((tagSendInfo*)lpThreadParameter);
    return ret;

转载请注明:虚无 » 模拟鼠标拖送功能

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址