模拟spy++ finder tool遇到的一点有关问题
模拟spy++ finder tool遇到的一点问题?
最近我在做一个模拟spy++ finder tool的小工具。先简单的说下环境:VC6.0 基于对话框的MFC EXE,类名是CSpyDlg,里面有一个Picture控件,一个Edit Box控件(用于显示窗体的句柄),另外,有两个图标文件.ico(用于放在Picture控件中显示,一个是正常状态下的显示IDI_ICON1,一个是鼠标拖出时的显示IDI_ICON2)和一个光标文件.cur(IDC_CURSOR1,用于拖出时的鼠标指针)。
如图:

我给Picture控件建一个CMyPic类,有一个WM_LBUTTONDOWN和WM_LBUTTONUP消息,响应函数代码如下
定时器响应函数(只写了最主要的几句)
经过上述步骤,程序完成。按下鼠标,鼠标变成IDC_CURSOR1,并启动定时器,当鼠标移至某个窗口时,就能在文本框中显示出该窗口的句柄。
问题是:我不想用定时器写这个实现过程,而是想用WM_MOUSEMOVE来实现,在图片控件上按下鼠标,利用WM_MOUSEMOVE,当鼠标移至某个窗口时,就能在文本框中显示出该窗口的句柄。我始终搞不定怎么才能全局的使这个MouseMove有效,因为如果我在CSpyDlg类中定义WM_MOUSEMOVE的响应函数OnMouseMove,鼠标出了我的MFC对话框就无效了...
不知该如何描述了,希望大家能看懂,明白我的意思,给予帮助!
------解决方案--------------------
setCapture?不知道可以不
------解决方案--------------------
SetCapture、ReleaseCapture 就是专门针对你这种情况设计的
------解决方案--------------------
直接用 全局鼠标钩子,在MOUSEMOVE中处理就行了。
------解决方案--------------------
HWND hwnd = ::WindowFromPoint(pnt) ;丢进全局鼠标钩子就可以了。
看看这个链接
最近我在做一个模拟spy++ finder tool的小工具。先简单的说下环境:VC6.0 基于对话框的MFC EXE,类名是CSpyDlg,里面有一个Picture控件,一个Edit Box控件(用于显示窗体的句柄),另外,有两个图标文件.ico(用于放在Picture控件中显示,一个是正常状态下的显示IDI_ICON1,一个是鼠标拖出时的显示IDI_ICON2)和一个光标文件.cur(IDC_CURSOR1,用于拖出时的鼠标指针)。
如图:
我给Picture控件建一个CMyPic类,有一个WM_LBUTTONDOWN和WM_LBUTTONUP消息,响应函数代码如下
void CMyPic::OnLButtonDown(UINT nFlags, CPoint point)
{
SetCapture();
HCURSOR hc=LoadCursor(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDC_CURSOR1));
::SetCursor(hc);
HICON hicon2=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON2));
this->SetIcon(hicon2);
//问题在这儿:这里设置当鼠标在图片控件上按下时,启动定时器,g_hMe是对话框窗口的句柄
FromHandle(g_hMe)->SetTimer(1,600,NULL);
CStatic::OnLButtonDown(nFlags, point);
}
void CMyPic::OnLButtonUp(UINT nFlags, CPoint point)
//代码略,与问题无关
定时器响应函数(只写了最主要的几句)
void CSpyDlg::OnTimer(UINT nIDEvent)
{
POINT pnt;
::GetCursorPos(&pnt); //取得鼠标坐标
HWND hwnd = ::WindowFromPoint(pnt) ; //取得鼠标指针处窗口句柄
//然后把hwnd转成字符形式后,用Edit Box控件显示
CDialog::OnTimer(nIDEvent);
}
经过上述步骤,程序完成。按下鼠标,鼠标变成IDC_CURSOR1,并启动定时器,当鼠标移至某个窗口时,就能在文本框中显示出该窗口的句柄。
问题是:我不想用定时器写这个实现过程,而是想用WM_MOUSEMOVE来实现,在图片控件上按下鼠标,利用WM_MOUSEMOVE,当鼠标移至某个窗口时,就能在文本框中显示出该窗口的句柄。我始终搞不定怎么才能全局的使这个MouseMove有效,因为如果我在CSpyDlg类中定义WM_MOUSEMOVE的响应函数OnMouseMove,鼠标出了我的MFC对话框就无效了...
不知该如何描述了,希望大家能看懂,明白我的意思,给予帮助!
------解决方案--------------------
setCapture?不知道可以不
------解决方案--------------------
SetCapture、ReleaseCapture 就是专门针对你这种情况设计的
------解决方案--------------------
直接用 全局鼠标钩子,在MOUSEMOVE中处理就行了。
------解决方案--------------------
HWND hwnd = ::WindowFromPoint(pnt) ;丢进全局鼠标钩子就可以了。
看看这个链接