如何实时响应鼠标按下后拖动的消息

比如在树控件或listctrl控件里拖动文件时,控件会根据鼠标的位置实时反映,比如展开树节点。而我在自己的程序里却不能收到鼠标按下时拖动的消息(强调一下,就是鼠标在其他窗... 比如在树控件或listctrl控件里拖动文件时,控件会根据鼠标的位置实时反映,比如展开树节点。而我在自己的程序里却不能收到鼠标按下时拖动的消息(强调一下,就是鼠标在其他窗口按下一个文件,拖动到我的窗口,但我的窗口不能捕获到鼠标WM_MOUSEMOVE的消息)用spy++也发现自己的程序窗口没有捕获到任何消息。
所以想请问一下应该如何设置窗口,才能收到这样的消息。谢谢大家了
1.接收文件的方法我知道,但我想要的不是这种效果。
2.全局钩子是可以的,不过是下策,希望有更好的。
3.刚才用Spy++测试了一下,ttplayer,资源管理器的ListView、TreeView、工具栏,菜单都能够收到在其他程序按下鼠标,并且在他们上面移动的消息,但不是WM_MOUSEMOVE,很奇怪。

这是我用全局钩子的方法,希望大家能够给个更好的方法。

switch ( ((MSG *)lParam)->message )
{
case WM_MOUSEMOVE:
{
//如果左键按下
if ( ((MSG *)lParam)->wParam & MK_LBUTTON )
{
//如果鼠标在目标窗口内移动
if (WindowFromPoint(point)==DesWnd)
{
//转换坐标
::ScreenToClient(DesWnd,&point);
//传递给目标窗口,不能用PostMessage,否知会陷入消息死循环
::SendMessage(DesWnd,WM_MOUSEMOVE,((MSG *)lParam)->wParam,MAKELPARAM(point.x, point.y));
}
}
}
break;
测试代码下载:http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC%5EM%5EM/GetMessage.zip
终于找到解决方法了 http://www.codeproject.com/KB/shell/explorerdragdrop.aspx
展开
 我来答
魔高丈
2010-08-24 · TA获得超过9506个赞
知道大有可为答主
回答量:2066
采纳率:0%
帮助的人:3434万
展开全部
你是想把资源管理器或我的电脑里的文件直接拖动到你的程序里然后直接打开吧。

如果你是非对话框的MFC程序,需要在CMainFrame::OnCreate
里添加
DragAcceptFiles();

然后你再拖动文件就能看见变化了。

然后在
Doc的OnOpenDocument里添加处理文件的代码:
例如:
BOOL CXXXDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

// TODO: Add your specialized creation code here

CString str;
str.Format("拖动的文件为:%s", lpszPathName);
AfxMessageBox(str);

return TRUE;
}

如果你要得到拖动文件的消息,那么可以在CMainFrame中捕获WM_DROPFILES试试。
例如:响应WM_DROPFILES消息:
void CMainFrame::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
const int fileCount = DragQueryFile(hDropInfo, (UINT)-1, NULL, 0);

ASSERT(fileCount >= 1);

TCHAR fileName[MAX_PATH] = { 0 };

CString strFile;

for (int i = 0; i < fileCount; ++i)
{
DragQueryFile(hDropInfo, i, fileName, MAX_PATH);
strFile += fileName;
strFile += ",";
}

CString str;
str.Format("拖动的文件为:%s", strFile);
MessageBox(str);

CFrameWnd::OnDropFiles(hDropInfo);
}
yaoyue1019
2010-08-24 · 知道合伙人互联网行家
yaoyue1019
知道合伙人互联网行家
采纳数:804 获赞数:3392
擅长lua脚本 与android前端交互设计

向TA提问 私信TA
展开全部
首先 设置一个变量,用来记录鼠标消息

mousedown的时候 mousepress 设置为true 表示为按定

mouseup的时候 mousepress设置为false 表示未按定

mousemove消息 如果 为按定 则dosomething()

else...
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chengaohe0120
2010-08-24 · TA获得超过982个赞
知道小有建树答主
回答量:1034
采纳率:50%
帮助的人:951万
展开全部
在属性中设置AcceFiles属性为true,或者用DragAcceptFiles函数设置.
然后响应wm_dropfiles消息.可以在这里调用DragQueryFiles,DragQueryPoints等函数来或取文件的信息
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
TT_RonG
2010-08-23 · TA获得超过156个赞
知道小有建树答主
回答量:168
采纳率:0%
帮助的人:236万
展开全部
不大懂你说什么...

你说的鼠标在其他窗口按下一个文件,拖动到自己的窗口中,在拖动过程中,当鼠标进入你的窗口区域内,你的窗口是否处于前台?即窗口是否激活?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_baby小人_
2010-08-27 · TA获得超过253个赞
知道小有建树答主
回答量:173
采纳率:0%
帮助的人:250万
展开全部
我想到个笨方法,做个全局鼠标钩子,每隔一段时间保存当前树控件或listctrl控件坐标,保存到钩子的共享数据段。当钩子监视到鼠标拖动到指定坐标发送消息给你的程序进行展开等操作

To补充:
以前没注意这方面的东西,谢谢楼主分享
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式