如何发送文件拖放的消息给另外一个程序

lin6194 2005-10-17 08:10:36
有一个程序支持文件拖放后打开的操作,我现在要在我的程序中发送这个消息给它,从MSDN查询不到HDROP这个结构的参数,哪位能告诉我这个消息的参数怎么写?
...全文
444 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
rolen 2005-10-19
  • 打赏
  • 举报
回复
mark
mct1025 2005-10-19
  • 打赏
  • 举报
回复
做了一段拖放到notepad的代码
使用SendMessage(hwnd, WM_DROPFILES, hDrop, NULL)
主要问题是hDrop是目标进程中的地址,需要VirtualAllocEx


char szFile[] = "d:\\data.txt";
HWND hWnd = ::FindWindow("Notepad", NULL);
if(hWnd == NULL) return;
DWORD dwBufSize = sizeof(DROPFILES) + sizeof(szFile) + 1;
BYTE *pBuf = NULL;
LPSTR pszRemote = NULL;
HANDLE hProcess = NULL;

__try {
pBuf = new BYTE[dwBufSize];
if(pBuf == NULL) __leave;

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

DWORD dwProcessId;
GetWindowThreadProcessId(hWnd, &dwProcessId);
hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwProcessId);
if(hProcess == NULL) __leave;

pszRemote = (LPSTR)VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);
if(pszRemote == NULL) __leave;

if(WriteProcessMemory(hProcess, pszRemote, pBuf, dwBufSize, 0))
::SendMessage(hWnd, WM_DROPFILES, (WPARAM)pszRemote, NULL);
}
__finally {
if(pBuf != NULL) delete []pBuf;
if(pszRemote != NULL) VirtualFreeEx(hProcess, pszRemote, dwBufSize, MEM_FREE);
if(hProcess != NULL) CloseHandle(hProcess);
}
yayaniuniu502 2005-10-18
  • 打赏
  • 举报
回复
你要模拟发送系统消息给另一个程序可能会出现冲突,你模拟它的操作嘛,换句话说就是在程序a中发送一个消息给程序b,在b中收到该消息后就把你要做的操作在写一便。

给个从程序a发送消息给b的例子:

主控程序的实现
(1)新建一工程文件:Sender,选取MFC AppWizard(exe)。
(2)第二步选取Single document(单文档)。
(3)其余几步均为确省值。
(4)添加三个菜单"命令一"、"命令二"、"命令三"及与之对应的函数:
OnSendComm1()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,0);
}
OnSendComm2()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,0,1);
}
OnSendComm3()
{
CString str="Receiver";
CWnd *pWnd=CWnd::FindWindow(NULL,str);
if(pWnd)
pWnd->SendMessage(WM_COMM,1,0);
}

在SenderView.h中添加自定义消息:#define WM_COMM WM_USER+100编译完成即可。
 

底层工作程序的实现
(1)新建工程Receiver、仍是单文档。
(2)在CReceiverApp类的InitInstance()函数末尾添加:
m_pMainWnd->SetWindowText("Receiver");
用以指定底层工作程序的窗口标题,以便主控程序能根据标题获取到此窗口的窗口句柄。
(3)在MainFrm.h中添加自定义消息:#define WM_COMM WM_USER+100。
(4)添加自定义消息WM_COMM的消息映射:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_COMM,OnSendMsg)
END_MESSAGE_MAP()

完成消息响应函数OnSendMsg()
void CMainFrame::OnSendMsg(WPARAM wParam, LPARAM lParam)
{
if(wParam==0 && lParam==0)
AfxMessageBox("主控程序发送命令一!");
if(wParam==0 && lParam==1)
AfxMessageBox("主控程序发送命令二!");
if(wParam==1 && lParam==0)
AfxMessageBox("主控程序发送命令三!");
}
lin6194 2005-10-18
  • 打赏
  • 举报
回复
Jexhat(真有你的) : 关键是怎么给hDrop赋值,把文件名传进去,MSDN里面没有找到这个hDrop对应的结构。直接把hDrop指向文件名,那个接收程序有反应,提示文件名不对。关键问题就是怎么给hDrop赋值了。

哪位有更详细的解决方案帮帮我吧,分数不够可以再开贴加分。
Jexhat 2005-10-17
  • 打赏
  • 举报
回复
不能用SendMessage(hwnd, WM_DROPFILES, hDrop, NULL)吗?
lin6194 2005-10-17
  • 打赏
  • 举报
回复
是另外一个进程的程序,那个程序本身有文件拖放功能,而且是第三方程序,不能修改。我是要在我的程序中控制它,代替手动拖动文件,让它能够处理。
lianglp 2005-10-17
  • 打赏
  • 举报
回复
你发送WM_DROPFILES 消息给另一个程序?是另一个进程的程序?
不可以这样的应该,这是系统产生的一个消息,其中给你分配了一个内存空间来保存
拖动的文件信息,你可以调用API:DragQueryFile(), DragQueryPoint(),
DragFinish等函数得到拖动的文件结果,进而进行对相应文件的操作。
lin6194 2005-10-17
  • 打赏
  • 举报
回复
SendMessage(WM_DROPFILES, wParam, lParam)

如何把文件名添加到wParam或者lParam里面?

15,471

社区成员

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

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