如何实时响应鼠标按下后拖动的消息
比如在树控件或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 展开
所以想请问一下应该如何设置窗口,才能收到这样的消息。谢谢大家了
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 展开
6个回答
展开全部
你是想把资源管理器或我的电脑里的文件直接拖动到你的程序里然后直接打开吧。
如果你是非对话框的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);
}
如果你是非对话框的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);
}
深圳市容大彩晶科技有限公司
2024-11-20 广告
2024-11-20 广告
作为深圳市容大彩晶科技有限公司的工作人员,对于公司广告机的功能有一定的了解。公司的广告机是否支持多语言显示,具体需根据产品型号和功能配置来确定。但一般而言,现代广告机通常具备多语言显示的功能,以适应不同国家和地区的需求。建议直接查阅产品说明...
点击进入详情页
本回答由深圳市容大彩晶科技有限公司提供
展开全部
首先 设置一个变量,用来记录鼠标消息
mousedown的时候 mousepress 设置为true 表示为按定
mouseup的时候 mousepress设置为false 表示未按定
mousemove消息 如果 为按定 则dosomething()
else...
mousedown的时候 mousepress 设置为true 表示为按定
mouseup的时候 mousepress设置为false 表示未按定
mousemove消息 如果 为按定 则dosomething()
else...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在属性中设置AcceFiles属性为true,或者用DragAcceptFiles函数设置.
然后响应wm_dropfiles消息.可以在这里调用DragQueryFiles,DragQueryPoints等函数来或取文件的信息
然后响应wm_dropfiles消息.可以在这里调用DragQueryFiles,DragQueryPoints等函数来或取文件的信息
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不大懂你说什么...
你说的鼠标在其他窗口按下一个文件,拖动到自己的窗口中,在拖动过程中,当鼠标进入你的窗口区域内,你的窗口是否处于前台?即窗口是否激活?
你说的鼠标在其他窗口按下一个文件,拖动到自己的窗口中,在拖动过程中,当鼠标进入你的窗口区域内,你的窗口是否处于前台?即窗口是否激活?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我想到个笨方法,做个全局鼠标钩子,每隔一段时间保存当前树控件或listctrl控件坐标,保存到钩子的共享数据段。当钩子监视到鼠标拖动到指定坐标发送消息给你的程序进行展开等操作
To补充:
以前没注意这方面的东西,谢谢楼主分享
To补充:
以前没注意这方面的东西,谢谢楼主分享
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询