我想实现一个全屏画线功能
我设想的是在MouseProc中截获鼠标消息,然后发给我的主程序,
然后由主程序完成绘图。
代码如下:
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;
if(nCode>=0)
{
::PostMessage(glDlg,wParam,NULL,MAKELPARAM(pMouseHook->pt.x,pMouseHook->pt
.y));
return 1;
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
可是失败了,当点击在客户区外面时,主程序无法完成绘图工作,还经常非法操作。
我这种方法错在那里?请指教
我设想的是在MouseProc中截获鼠标消息,然后发给我的主程序,
然后由主程序完成绘图。
代码如下:
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;
if(nCode>=0)
{
::PostMessage(glDlg,wParam,NULL,MAKELPARAM(pMouseHook->pt.x,pMouseHook->pt
.y));
return 1;
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
可是失败了,当点击在客户区外面时,主程序无法完成绘图工作,还经常非法操作。
我这种方法错在那里?请指教
{
::PostMessage(glDlg,wParam,NULL,MAKELPARAM(pMouseHook->pt.x,pMouseHook->pt
.y));
return 1;
}
else
return CallNextHookEx(glhHook,nCode,wParam,lParam);
继续求教,很急
:(
1你应该作下测试,在你主程序接收鼠标消息的函数(onlbuttondown?)中看一看接收到的消息对不对。你可以把接收到的参数存到文件里,或用messagebeep等函数测试有效性,但千万别乱用messagebox之类开窗口的函数,这可能给你“一次痛苦的经历”。
2另外我想,你如果想在客户区外绘图,就要用desktop的dc.这样:
CWnd *pwndDesktop=CWnd::FormHandle(::getdesktopwindow());
CWindowDC dc(pwndDesktop);
//以后用此dc作所有绘画操作......
3题外话,我觉得是不是只把鼠标按下和松开的消息发送给主程序。要是连mousemove也截获的话,会不会太占用资源了......
4.希望你把主程序中的相关代码贴出来
可以,这样你可以自定义。
对了,你对GINA了解吗?我想在WIN2000登陆之前运行我的EXE文件,在GINA中怎么修改
忘了~
只是感觉这个拦截鼠标移动,然后不传出去不太好~
机器没有VC/MSDN~
:(
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;
if(nCode>=0)
{
MSG mess;
if(wParam==WM_LBUTTONDOWN)
mess.message=MY_1;
else if(wParam==WM_MOUSEMOVE)
mess.message=MY_2;
mess.pt.x=pMouseHook->pt.x;
mess.pt.y=pMouseHook->pt.y;
::SendMessage(glDlg,mess.message,0,0); return 1;
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}我的接受程序中用下面这个接受消息
BOOL CClientDlg::PreTranslateMessage(MSG* pMsg)
{
if(m_bStart&&pMsg->message == MY_1)
{
CPoint point;
point.x=pMsg->pt.x;
point.y=pMsg->pt.y;
SetCapture();
m_pDC->MoveTo(point);
m_bLBD=TRUE;
}
else if(m_bStart&&m_bLBD&&pMsg->message == MY_2)
{
CPoint point;
point.x=pMsg->pt.x;
point.y=pMsg->pt.y;
m_pDC->LineTo(point);
}
return CDialog::PreTranslateMessage(pMsg);
}
可是现在一点反映都没有了
呜呜 :(
能不能告诉我你的qq什么的,这个问题好急的说
谢谢
我已经写成全局并且共享数据了
:(
一。::SendMessage(glDlg,mess.message,0,0);语句改为:
::SendMessage(glDlg,MY_1,0,lParam);
二。在PreTranslateMessage接受lParam;
然后初始化:LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR*)lParam;得到PMouseHook.x,pMouseHook.y;
剩下的自己相应修改。
我的邮箱:[email protected]
你把源码发过来,我试试
{
LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lParam;
if (nCode<0)
{
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
if(wParam == WM_MOUSEMOVE)
{
POINT MousePoint;
RECT rect;
MousePoint=pMouseHook->pt;
HWND hwnd=WindowFromPoint(MousePoint);
ScreenToClient(hwnd,&MousePoint);
rect.left=MousePoint.x-100;
rect.top=MousePoint.y-3;
rect.right=MousePoint.x+100;
rect.bottom=MousePoint.y+3;
InvalidateRect(hwnd,&rect,FALSE);
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);//继续传递消息
}
我的是这么写的~
這是勾子的程序.(鼠標或者鍵盤都有)
我建議你用保存一個主窗口的指針.然後用->PostMessage
调用你的钩子时,你的钩子函数会判断父窗口的值是否等于glD
lg,问题就出在这个地方,因为句柄值是进程相关的,也就是说,同一个窗口在不同的进程里的句柄值是不一样的。在其它进程地址空间里向一个句柄值为glDlg的窗口发消息,那么这个消息不知道发到哪里去了,也许句柄值为glDlg的窗口根本就不存在。
然后请看下面这个例子,
可以在mousemove的时候显示窗体的标题,
GetWindowText(glhTargetWnd,szCaption,100);
//glhTargetWnd是鼠标移动到的窗体的句柄,得到他的标题
if(IsWindow(glhDisplayWnd))
{
SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);
//glhDisplayWnd是主程序中一个Edit的句柄
SendMessage(glDlg,WM_MY1,0,0);
//glDlg是主程序对话框的句柄
}
//结果是给Edit发消息有效,给窗体就无效,想不通阿
大家讨论讨论吧
句柄是这样传给钩子的
在dlg中:
CWnd* pwnd=GetDlgItem(IDC_EDIT1);
m_hook.StartHook(pwnd->GetSafeHwnd(),AfxGetApp()->GetMainWnd()->GetSafeHwnd());
有什么问题吗?
这几天我糊涂死了。
:(
不好意思,这几天一直在忙其它的事情。
我已经按照你的意思写了一个最简化的程序,不敢写太多代码怕跟你的意图不一样.你看看效果:
http://www.angelfire.com/falcon/canyoufly/line.zip(源程序+可执行文件+dll)。大家共同研究。
不好意思,这几天一直在忙其它的事情。
我已经按照你的意思写了一个最简化的程序,不敢写太多代码怕跟你的意图不一样.http://www.angelfire.com/falcon/canyoufly/line.zip(源程序+可执行文件+dll)。
效果是程序运行时,任何时候都会在鼠标左键点击后在鼠标的位置画一个矩形。
大家共同研究。